From 7eda670f4bb73f9c079611f77cd12e52977ee82c Mon Sep 17 00:00:00 2001 From: dmiller Date: Tue, 20 Sep 2022 23:37:28 +0000 Subject: [PATCH] Fix socks4 proxy parsing when target resolves to IPv6 --- nsock/src/nsock_proxy.c | 14 +++++++++++--- nsock/src/nsock_proxy.h | 2 +- nsock/src/proxy_http.c | 2 +- nsock/src/proxy_socks4.c | 2 +- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/nsock/src/nsock_proxy.c b/nsock/src/nsock_proxy.c index a8d6112ae..f90546e00 100644 --- a/nsock/src/nsock_proxy.c +++ b/nsock/src/nsock_proxy.c @@ -443,13 +443,21 @@ void nsock_proxy_ev_dispatch(nsock_pool nspool, nsock_event nsevent, void *udata } } -int proxy_resolve(const char *host, struct sockaddr *addr, size_t *addrlen) { +int proxy_resolve(const char *host, struct sockaddr *addr, size_t *addrlen, int ai_family) { + struct addrinfo hints; struct addrinfo *res; int rc; - rc = getaddrinfo(host, NULL, NULL, &res); - if (rc) + memset(&hints, 0, sizeof(hints)); + hints.ai_family = ai_family; + /* All proxy types are TCP-only at the moment */ + hints.ai_socktype = SOCK_STREAM; + + rc = getaddrinfo(host, NULL, &hints, &res); + if (rc) { + nsock_log_info("getaddrinfo error: %s", gai_strerror(rc)); return -abs(rc); + } *addr = *res->ai_addr; *addrlen = res->ai_addrlen; diff --git a/nsock/src/nsock_proxy.h b/nsock/src/nsock_proxy.h index ff29d8540..50e26a4a3 100644 --- a/nsock/src/nsock_proxy.h +++ b/nsock/src/nsock_proxy.h @@ -150,7 +150,7 @@ struct proxy_spec { /* ------------------- UTIL FUNCTIONS ------------------- */ -int proxy_resolve(const char *host, struct sockaddr *addr, size_t *addrlen); +int proxy_resolve(const char *host, struct sockaddr *addr, size_t *addrlen, int ai_family); static inline struct proxy_node *proxy_ctx_node_next(struct proxy_chain_context *ctx) { gh_lnode_t *next; diff --git a/nsock/src/proxy_http.c b/nsock/src/proxy_http.c index 3c6826c0b..bcdb1dfd1 100644 --- a/nsock/src/proxy_http.c +++ b/nsock/src/proxy_http.c @@ -75,7 +75,7 @@ static int proxy_http_node_new(struct proxy_node **node, const struct uri *uri) proxy = (struct proxy_node *)safe_zalloc(sizeof(struct proxy_node)); proxy->spec = &ProxySpecHttp; - rc = proxy_resolve(uri->host, (struct sockaddr *)&proxy->ss, &proxy->sslen); + rc = proxy_resolve(uri->host, (struct sockaddr *)&proxy->ss, &proxy->sslen, AF_UNSPEC); if (rc < 0) { free(proxy); *node = NULL; diff --git a/nsock/src/proxy_socks4.c b/nsock/src/proxy_socks4.c index 9efc47f30..4c9f492f8 100644 --- a/nsock/src/proxy_socks4.c +++ b/nsock/src/proxy_socks4.c @@ -85,7 +85,7 @@ static int proxy_socks4_node_new(struct proxy_node **node, const struct uri *uri proxy = (struct proxy_node *)safe_zalloc(sizeof(struct proxy_node)); proxy->spec = &ProxySpecSocks4; - rc = proxy_resolve(uri->host, (struct sockaddr *)&proxy->ss, &proxy->sslen); + rc = proxy_resolve(uri->host, (struct sockaddr *)&proxy->ss, &proxy->sslen, AF_INET); if (rc < 0) goto err_out;