[tor-commits] [torsocks/master] Add IPv6 support to Tor resolve command

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


commit 6a0bc8b32f884a4ab12a4b5bf356c418c3072d95
Author: David Goulet <dgoulet at ev0ke.net>
Date:   Sun Jun 23 14:56:36 2013 -0400

    Add IPv6 support to Tor resolve command
    
    Signed-off-by: David Goulet <dgoulet at ev0ke.net>
---
 src/common/socks5.c |   35 +++++++++++++++++++++++++++++------
 src/common/socks5.h |    3 ++-
 src/lib/torsocks.c  |    3 ++-
 3 files changed, 33 insertions(+), 8 deletions(-)

diff --git a/src/common/socks5.c b/src/common/socks5.c
index d007599..fcb30d7 100644
--- a/src/common/socks5.c
+++ b/src/common/socks5.c
@@ -449,20 +449,25 @@ error:
  *
  * Return 0 on success else a negative value.
  */
-int socks5_recv_resolve_reply(struct connection *conn, uint32_t *ip_addr)
+int socks5_recv_resolve_reply(struct connection *conn, void *addr,
+		size_t addrlen)
 {
 	int ret;
+	size_t recv_len;
 	ssize_t ret_recv;
 	struct {
 		struct socks5_reply msg;
-		uint32_t addr;
+		union {
+			uint8_t ipv4[4];
+			uint8_t ipv6[16];
+		} addr;
 	} buffer;
 
 	assert(conn);
 	assert(conn >= 0);
-	assert(ip_addr);
+	assert(addr);
 
-	ret_recv = recv_data(conn->fd, &buffer, sizeof(buffer));
+	ret_recv = recv_data(conn->fd, &buffer, sizeof(buffer.msg));
 	if (ret_recv < 0) {
 		ret = ret_recv;
 		goto error;
@@ -481,16 +486,34 @@ int socks5_recv_resolve_reply(struct connection *conn, uint32_t *ip_addr)
 	}
 
 	if (buffer.msg.atyp == SOCKS5_ATYP_IPV4) {
-		*ip_addr = buffer.addr;
+		/* Size of a binary IPv4 in bytes. */
+		recv_len = sizeof(buffer.addr.ipv4);
+	} else if (buffer.msg.atyp == SOCKS5_ATYP_IPV6) {
+		/* Size of a binary IPv6 in bytes. */
+		recv_len = sizeof(buffer.addr.ipv6);
 	} else {
 		ERR("Bad SOCKS5 atyp reply %d", buffer.msg.atyp);
 		ret = -EINVAL;
 		goto error;
 	}
 
+	ret_recv = recv_data(conn->fd, &buffer.addr, recv_len);
+	if (ret_recv < 0) {
+		ret = ret_recv;
+		goto error;
+	}
+
+	if (addrlen < recv_len) {
+		ERR("[socks5] Resolve destination buffer too small");
+		ret = -EINVAL;
+		goto error;
+	}
+
+	memcpy(addr, &buffer.addr, recv_len);
+
 	/* Everything went well and ip_addr has been populated. */
 	ret = 0;
-	DBG("[socks5] Resolve reply received: %" PRIu32, *ip_addr);
+	DBG("[socks5] Resolve reply received successfully");
 
 error:
 	return ret;
diff --git a/src/common/socks5.h b/src/common/socks5.h
index 9b47aa1..2699357 100644
--- a/src/common/socks5.h
+++ b/src/common/socks5.h
@@ -130,7 +130,8 @@ int socks5_recv_connect_reply(struct connection *conn);
 
 /* Tor DNS resolve. */
 int socks5_send_resolve_request(const char *hostname, struct connection *conn);
-int socks5_recv_resolve_reply(struct connection *conn, uint32_t *ip_addr);
+int socks5_recv_resolve_reply(struct connection *conn, void *addr,
+		size_t addrlent);
 int socks5_recv_resolve_ptr_reply(struct connection *conn, char **_hostname);
 int socks5_send_resolve_ptr_request(const void *ip, struct connection *conn);
 
diff --git a/src/lib/torsocks.c b/src/lib/torsocks.c
index 28cd183..6b657ef 100644
--- a/src/lib/torsocks.c
+++ b/src/lib/torsocks.c
@@ -289,7 +289,8 @@ int tsocks_tor_resolve(const char *hostname, uint32_t *ip_addr)
 		goto error;
 	}
 
-	ret = socks5_recv_resolve_reply(&conn, ip_addr);
+	/* Force IPv4 resolution for now. */
+	ret = socks5_recv_resolve_reply(&conn, ip_addr, sizeof(uint32_t));
 	if (ret < 0) {
 		goto error;
 	}





More information about the tor-commits mailing list