[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