commit 6c003efb7af3158b41396193de49621ea795007d Author: Luke Gallagher luke@hypergeometric.net Date: Mon Feb 17 10:08:00 2014 +1100
Fix: change socks5_send_ptr_request to use address type
inet_ntop returns a pointer to the destination string, so an IPv6 address would always be converted as if it were an IPv4 address (AF_INET).
Add the address family as a third parameter to socks5_send_ptr_request to reliably determine the address type to request. The order of parameters to socks5_send_ptr_request has also been changed.
Signed-off-by: David Goulet dgoulet@ev0ke.net --- src/common/socks5.c | 12 +++++++----- src/common/socks5.h | 2 +- src/lib/torsocks.c | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-)
diff --git a/src/common/socks5.c b/src/common/socks5.c index edf5c2e..fb0dc9c 100644 --- a/src/common/socks5.c +++ b/src/common/socks5.c @@ -585,11 +585,10 @@ error: * Return 0 on success or else a negative value. */ ATTR_HIDDEN -int socks5_send_resolve_ptr_request(const void *ip, struct connection *conn) +int socks5_send_resolve_ptr_request(struct connection *conn, const void *ip, int af) { int ret, ret_send; char buffer[20]; /* Can't go higher than that (with IPv6). */ - char ip_str[INET6_ADDRSTRLEN]; size_t msg_len, data_len; struct socks5_request msg; struct socks5_request_resolve_ptr req; @@ -607,13 +606,16 @@ int socks5_send_resolve_ptr_request(const void *ip, struct connection *conn) /* Always zeroed. */ msg.rsv = 0;
- if (inet_ntop(AF_INET, ip, ip_str, sizeof(ip_str))) { + switch (af) { + case AF_INET: msg.atyp = SOCKS5_ATYP_IPV4; memcpy(req.addr.ipv4, ip, 4); - } else if (inet_ntop(AF_INET6, ip, ip_str, sizeof(ip_str))) { + break; + case AF_INET6: msg.atyp = SOCKS5_ATYP_IPV6; memcpy(req.addr.ipv6, ip, 16); - } else { + break; + default: ERR("Unknown address domain of %d", ip); ret = -EINVAL; goto error; diff --git a/src/common/socks5.h b/src/common/socks5.h index 2699357..67da3aa 100644 --- a/src/common/socks5.h +++ b/src/common/socks5.h @@ -133,6 +133,6 @@ int socks5_send_resolve_request(const char *hostname, struct connection *conn); 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); +int socks5_send_resolve_ptr_request(struct connection *conn, const void *ip, int af);
#endif /* TORSOCKS_SOCKS_H */ diff --git a/src/lib/torsocks.c b/src/lib/torsocks.c index 4bbe072..ba7142d 100644 --- a/src/lib/torsocks.c +++ b/src/lib/torsocks.c @@ -454,7 +454,7 @@ int tsocks_tor_resolve_ptr(const char *addr, char **ip, int af) goto end_close; }
- ret = socks5_send_resolve_ptr_request(addr, &conn); + ret = socks5_send_resolve_ptr_request(&conn, addr, af); if (ret < 0) { goto end_close; }
tor-commits@lists.torproject.org