[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] [torsocks/master] Add fclose() support
commit 7dee92c5f0e29222258dd10074bbdf8a008bc749
Author: David Goulet <dgoulet@xxxxxxxxx>
Date: Sat Mar 8 11:20:07 2014 -0500
Add fclose() support
Fixes #29
Signed-off-by: David Goulet <dgoulet@xxxxxxxxx>
---
src/lib/Makefile.am | 2 +-
src/lib/fclose.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++
src/lib/torsocks.h | 15 +++++++++
3 files changed, 101 insertions(+), 1 deletion(-)
diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am
index cccecf1..d64b3f6 100644
--- a/src/lib/Makefile.am
+++ b/src/lib/Makefile.am
@@ -9,6 +9,6 @@ lib_LTLIBRARIES = libtorsocks.la
libtorsocks_la_SOURCES = torsocks.c torsocks.h \
connect.c gethostbyname.c getaddrinfo.c close.c \
getpeername.c socket.c syscall.c socketpair.c recv.c \
- exit.c accept.c listen.c
+ exit.c accept.c listen.c fclose.c
libtorsocks_la_LIBADD = $(top_builddir)/src/common/libcommon.la
diff --git a/src/lib/fclose.c b/src/lib/fclose.c
new file mode 100644
index 0000000..8d371cd
--- /dev/null
+++ b/src/lib/fclose.c
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2014 - David Goulet <dgoulet@xxxxxxxxx>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License, version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 51
+ * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <common/connection.h>
+#include <common/log.h>
+
+#include "torsocks.h"
+
+/* fclose(3) */
+TSOCKS_LIBC_DECL(fclose, LIBC_FCLOSE_RET_TYPE, LIBC_FCLOSE_SIG)
+
+/*
+ * Torsocks call for fclose(3).
+ */
+LIBC_FCLOSE_RET_TYPE tsocks_fclose(LIBC_FCLOSE_SIG)
+{
+ int fd;
+ struct connection *conn;
+
+ if (!fp) {
+ errno = EBADF;
+ goto error;
+ }
+
+ fd = fileno(fp);
+ if (fd < 0) {
+ /* errno is set to EBADF here by fileno(). */
+ goto error;
+ }
+
+ DBG("[fclose] Close catched for fd %d", fd);
+
+ connection_registry_lock();
+ conn = connection_find(fd);
+ if (conn) {
+ /*
+ * Remove from the registry so it's not visible anymore and thus using
+ * it without lock.
+ */
+ connection_remove(conn);
+ }
+ connection_registry_unlock();
+
+ /*
+ * Put back the connection reference. If the refcount get to 0, the
+ * connection pointer is destroyed.
+ */
+ if (conn) {
+ DBG("Close connection putting back ref");
+ connection_put_ref(conn);
+ }
+
+ /* Return the original libc fclose. */
+ return tsocks_libc_fclose(fp);
+
+error:
+ return -1;
+}
+
+/*
+ * Libc hijacked symbol fclose(3).
+ */
+LIBC_FCLOSE_DECL
+{
+ if (!tsocks_libc_fclose) {
+ tsocks_libc_fclose = tsocks_find_libc_symbol(
+ LIBC_FCLOSE_NAME_STR, TSOCKS_SYM_EXIT_NOT_FOUND);
+ }
+
+ return tsocks_fclose(LIBC_FCLOSE_ARGS);
+}
diff --git a/src/lib/torsocks.h b/src/lib/torsocks.h
index 1b95cb9..057a32e 100644
--- a/src/lib/torsocks.h
+++ b/src/lib/torsocks.h
@@ -74,6 +74,15 @@
#define LIBC_CLOSE_SIG int fd
#define LIBC_CLOSE_ARGS fd
+/* fclose(3) */
+#include <stdio.h>
+
+#define LIBC_FCLOSE_NAME fclose
+#define LIBC_FCLOSE_NAME_STR XSTR(LIBC_FCLOSE_NAME)
+#define LIBC_FCLOSE_RET_TYPE int
+#define LIBC_FCLOSE_SIG FILE *fp
+#define LIBC_FCLOSE_ARGS fp
+
/* gethostbyname(3) - DEPRECATED in glibc. */
#include <netdb.h>
@@ -297,6 +306,12 @@ TSOCKS_DECL(close, LIBC_CLOSE_RET_TYPE, LIBC_CLOSE_SIG)
#define LIBC_CLOSE_DECL \
LIBC_CLOSE_RET_TYPE LIBC_CLOSE_NAME(LIBC_CLOSE_SIG)
+/* fclose(3) */
+extern TSOCKS_LIBC_DECL(fclose, LIBC_FCLOSE_RET_TYPE, LIBC_FCLOSE_SIG)
+TSOCKS_DECL(fclose, LIBC_FCLOSE_RET_TYPE, LIBC_FCLOSE_SIG)
+#define LIBC_FCLOSE_DECL \
+ LIBC_FCLOSE_RET_TYPE LIBC_FCLOSE_NAME(LIBC_FCLOSE_SIG)
+
/* gethostbyname(3) */
extern TSOCKS_LIBC_DECL(gethostbyname, LIBC_GETHOSTBYNAME_RET_TYPE,
LIBC_GETHOSTBYNAME_SIG)
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits