[tor-commits] [torsocks/master] Implement gethostbyname2() GNU extension call

dgoulet at torproject.org dgoulet at torproject.org
Fri Apr 4 22:40:25 UTC 2014


commit c9beeafef8afaae18e25ac13bea616d4f7513992
Author: David Goulet <dgoulet at ev0ke.net>
Date:   Sun Jun 23 21:04:31 2013 -0400

    Implement gethostbyname2() GNU extension call
    
    Signed-off-by: David Goulet <dgoulet at ev0ke.net>
---
 src/lib/gethostbyname.c |   29 +++++++++++++++++++++++++++++
 src/lib/torsocks.h      |   13 +++++++++++++
 2 files changed, 42 insertions(+)

diff --git a/src/lib/gethostbyname.c b/src/lib/gethostbyname.c
index 58a7290..d9afec9 100644
--- a/src/lib/gethostbyname.c
+++ b/src/lib/gethostbyname.c
@@ -19,6 +19,7 @@
 
 #include <arpa/inet.h>
 #include <assert.h>
+#include <stdlib.h>
 
 #include <common/log.h>
 
@@ -84,3 +85,31 @@ LIBC_GETHOSTBYNAME_DECL
 {
 	return tsocks_gethostbyname(LIBC_GETHOSTBYNAME_ARGS);
 }
+
+/*
+ * Torsocks call for gethostbyname2(3).
+ *
+ * This call, like gethostbyname(), returns pointer to static data thus is
+ * absolutely not reentrant.
+ */
+LIBC_GETHOSTBYNAME2_RET_TYPE tsocks_gethostbyname2(LIBC_GETHOSTBYNAME2_SIG)
+{
+	/*
+	 * For now, there is no way of resolving a domain name to IPv6 through Tor
+	 * so only accept INET request thus using the original gethostbyname().
+	 */
+	if (__af != AF_INET) {
+		h_errno = HOST_NOT_FOUND;
+		return NULL;
+	}
+
+	return tsocks_gethostbyname(__name);
+}
+
+/*
+ * Libc hijacked symbol gethostbyname2(3).
+ */
+LIBC_GETHOSTBYNAME2_DECL
+{
+	return tsocks_gethostbyname2(LIBC_GETHOSTBYNAME2_ARGS);
+}
diff --git a/src/lib/torsocks.h b/src/lib/torsocks.h
index de62c33..0121716 100644
--- a/src/lib/torsocks.h
+++ b/src/lib/torsocks.h
@@ -64,6 +64,13 @@ char tsocks_he_addr[INET_ADDRSTRLEN];
 #define LIBC_GETHOSTBYNAME_SIG const char *__name
 #define LIBC_GETHOSTBYNAME_ARGS __name
 
+/* gethostbyname2(3) - GNU extension to avoid static data. */
+#define LIBC_GETHOSTBYNAME2_NAME gethostbyname2
+#define LIBC_GETHOSTBYNAME2_NAME_STR XSTR(LIBC_GETHOSTBYNAME2_NAME)
+#define LIBC_GETHOSTBYNAME2_RET_TYPE struct hostent *
+#define LIBC_GETHOSTBYNAME2_SIG const char *__name, int __af
+#define LIBC_GETHOSTBYNAME2_ARGS __name, __af
+
 /* getaddrinfo(3) */
 #include <netdb.h>
 
@@ -95,6 +102,12 @@ TSOCKS_LIBC_DECL(gethostbyname, LIBC_GETHOSTBYNAME_RET_TYPE,
 #define LIBC_GETHOSTBYNAME_DECL LIBC_GETHOSTBYNAME_RET_TYPE \
 		LIBC_GETHOSTBYNAME_NAME(LIBC_GETHOSTBYNAME_SIG)
 
+/* gethostbyname2(3) */
+TSOCKS_LIBC_DECL(gethostbyname2, LIBC_GETHOSTBYNAME2_RET_TYPE,
+		LIBC_GETHOSTBYNAME2_SIG)
+#define LIBC_GETHOSTBYNAME2_DECL LIBC_GETHOSTBYNAME2_RET_TYPE \
+		LIBC_GETHOSTBYNAME2_NAME(LIBC_GETHOSTBYNAME2_SIG)
+
 /* getaddrinfo(3) */
 TSOCKS_LIBC_DECL(getaddrinfo, LIBC_GETADDRINFO_RET_TYPE,
 		LIBC_GETADDRINFO_SIG)





More information about the tor-commits mailing list