commit c9beeafef8afaae18e25ac13bea616d4f7513992 Author: David Goulet dgoulet@ev0ke.net Date: Sun Jun 23 21:04:31 2013 -0400
Implement gethostbyname2() GNU extension call
Signed-off-by: David Goulet dgoulet@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)
tor-commits@lists.torproject.org