[tor-commits] [torsocks/master] Fix: make tsock_tor_resolve support IPv6

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


commit 8495857ce613023e75bd3f29da860952e793cd7f
Author: David Goulet <dgoulet at ev0ke.net>
Date:   Thu Feb 20 15:08:09 2014 +0000

    Fix: make tsock_tor_resolve support IPv6
    
    Note that the tor daemon does not support IPv6 DNS resolution through
    the SOCKS port thus for now it is denied.
    
    Signed-off-by: David Goulet <dgoulet at ev0ke.net>
---
 src/lib/getaddrinfo.c   |    2 +-
 src/lib/gethostbyname.c |    4 ++--
 src/lib/torsocks.c      |   25 +++++++++++++++++++------
 src/lib/torsocks.h      |    2 +-
 4 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/src/lib/getaddrinfo.c b/src/lib/getaddrinfo.c
index da9d4ed..003e51f 100644
--- a/src/lib/getaddrinfo.c
+++ b/src/lib/getaddrinfo.c
@@ -85,7 +85,7 @@ LIBC_GETADDRINFO_RET_TYPE tsocks_getaddrinfo(LIBC_GETADDRINFO_SIG)
 	ret = inet_pton(af, node, addr);
 	if (ret == 0) {
 		/* The node most probably is a DNS name. */
-		ret = tsocks_tor_resolve(node, (uint32_t *) addr);
+		ret = tsocks_tor_resolve(af, node, addr);
 		if (ret < 0) {
 			ret = EAI_FAIL;
 			goto error;
diff --git a/src/lib/gethostbyname.c b/src/lib/gethostbyname.c
index 1b9d00e..6b4ea21 100644
--- a/src/lib/gethostbyname.c
+++ b/src/lib/gethostbyname.c
@@ -72,7 +72,7 @@ LIBC_GETHOSTBYNAME_RET_TYPE tsocks_gethostbyname(LIBC_GETHOSTBYNAME_SIG)
 	}
 
 	/* Resolve the given hostname through Tor. */
-	ret = tsocks_tor_resolve(name, &ip);
+	ret = tsocks_tor_resolve(AF_INET, name, &ip);
 	if (ret < 0) {
 		goto error;
 	}
@@ -341,7 +341,7 @@ LIBC_GETHOSTBYNAME_R_RET_TYPE tsocks_gethostbyname_r(LIBC_GETHOSTBYNAME_R_SIG)
 	}
 
 	/* Resolve the given hostname through Tor. */
-	ret = tsocks_tor_resolve(name, &ip);
+	ret = tsocks_tor_resolve(AF_INET, name, &ip);
 	if (ret < 0) {
 		goto error;
 	}
diff --git a/src/lib/torsocks.c b/src/lib/torsocks.c
index bb7773c..9b3100c 100644
--- a/src/lib/torsocks.c
+++ b/src/lib/torsocks.c
@@ -367,16 +367,30 @@ error:
  *
  * Return 0 on success else a negative value and the result addr is untouched.
  */
-int tsocks_tor_resolve(const char *hostname, uint32_t *ip_addr)
+int tsocks_tor_resolve(int af, const char *hostname, void *ip_addr)
 {
 	int ret;
+	size_t addr_len;
 	struct connection conn;
 
 	assert(hostname);
 	assert(ip_addr);
 
-	ret = utils_localhost_resolve(hostname, AF_INET, ip_addr,
-			sizeof(uint32_t));
+	if (af == AF_INET) {
+		addr_len = sizeof(uint32_t);
+		conn.dest_addr.domain = CONNECTION_DOMAIN_INET;
+	} else if (af == AF_INET6) {
+		addr_len = 16;
+		conn.dest_addr.domain = CONNECTION_DOMAIN_INET6;
+		/* Tor daemon does not support IPv6 DNS resolution yet. */
+		ret = -ENOSYS;
+		goto error;
+	} else {
+		ret = -EINVAL;
+		goto error;
+	}
+
+	ret = utils_localhost_resolve(hostname, af, ip_addr, addr_len);
 	if (ret) {
 		/* Found to be a localhost name. */
 		ret = 0;
@@ -401,13 +415,12 @@ int tsocks_tor_resolve(const char *hostname, uint32_t *ip_addr)
 		}
 	}
 
-	conn.fd = tsocks_libc_socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
+	conn.fd = tsocks_libc_socket(af, SOCK_STREAM, IPPROTO_TCP);
 	if (conn.fd < 0) {
 		PERROR("socket");
 		ret = -errno;
 		goto error;
 	}
-	conn.dest_addr.domain = CONNECTION_DOMAIN_INET;
 
 	ret = setup_tor_connection(&conn);
 	if (ret < 0) {
@@ -420,7 +433,7 @@ int tsocks_tor_resolve(const char *hostname, uint32_t *ip_addr)
 	}
 
 	/* Force IPv4 resolution for now. */
-	ret = socks5_recv_resolve_reply(&conn, ip_addr, sizeof(uint32_t));
+	ret = socks5_recv_resolve_reply(&conn, ip_addr, addr_len);
 	if (ret < 0) {
 		goto end_close;
 	}
diff --git a/src/lib/torsocks.h b/src/lib/torsocks.h
index 01c25b0..1b95cb9 100644
--- a/src/lib/torsocks.h
+++ b/src/lib/torsocks.h
@@ -383,7 +383,7 @@ extern unsigned int tsocks_cleaned_up;
 int tsocks_connect_to_tor(struct connection *conn);
 void *tsocks_find_libc_symbol(const char *symbol,
 		enum tsocks_sym_action action);
-int tsocks_tor_resolve(const char *hostname, uint32_t *ip_addr);
+int tsocks_tor_resolve(int af, const char *hostname, void *ip_addr);
 int tsocks_tor_resolve_ptr(const char *addr, char **ip, int af);
 void tsocks_cleanup(void);
 





More information about the tor-commits mailing list