From 67a08dca27a6a07b36c7f97252e284ca957ff1a5 Mon Sep 17 00:00:00 2001 From: Marcel Raad Date: Tue, 26 Nov 2019 15:06:31 +0100 Subject: [PATCH] curl_setup: disable IPv6 resolver without `getaddrinfo` Also, use `CURLRES_IPV6` only for actual DNS resolution, not for IPv6 address support. This makes it possible to connect to IPv6 literals by setting `ENABLE_IPV6` even without `getaddrinfo` support. It also fixes the CMake build when using the synchronous resolver without `getaddrinfo` support. Closes https://github.com/curl/curl/pull/4662 --- lib/asyn-thread.c | 14 ++++++++++++-- lib/curl_setup.h | 2 +- lib/hostip4.c | 10 ++++++++++ tests/server/resolve.c | 6 +++--- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/lib/asyn-thread.c b/lib/asyn-thread.c index 8c552baa9..b08497aaa 100755 --- a/lib/asyn-thread.c +++ b/lib/asyn-thread.c @@ -698,6 +698,16 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn, *waitp = 0; /* default to synchronous response */ +#ifdef ENABLE_IPV6 + { + struct in6_addr in6; + /* check if this is an IPv6 address string */ + if(Curl_inet_pton(AF_INET6, hostname, &in6) > 0) + /* This is an IPv6 address literal */ + return Curl_ip2addr(AF_INET6, &in6, hostname, port); + } +#endif /* ENABLE_IPV6 */ + if(Curl_inet_pton(AF_INET, hostname, &in) > 0) /* This is a dotted IP address 123.123.123.123-style */ return Curl_ip2addr(AF_INET, &in, hostname, port); @@ -741,7 +751,7 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn, /* This is a dotted IP address 123.123.123.123-style */ return Curl_ip2addr(AF_INET, &in, hostname, port); } -#ifdef CURLRES_IPV6 +#ifdef ENABLE_IPV6 { struct in6_addr in6; /* check if this is an IPv6 address string */ @@ -749,7 +759,7 @@ Curl_addrinfo *Curl_resolver_getaddrinfo(struct connectdata *conn, /* This is an IPv6 address literal */ return Curl_ip2addr(AF_INET6, &in6, hostname, port); } -#endif /* CURLRES_IPV6 */ +#endif /* ENABLE_IPV6 */ #endif /* !USE_RESOLVE_ON_IPS */ #ifdef CURLRES_IPV6 diff --git a/lib/curl_setup.h b/lib/curl_setup.h index cc36e28ec..5d6e8d6f7 100644 --- a/lib/curl_setup.h +++ b/lib/curl_setup.h @@ -585,7 +585,7 @@ # define CURLRES_SYNCH #endif -#ifdef ENABLE_IPV6 +#if defined(ENABLE_IPV6) && defined(HAVE_GETADDRINFO) # define CURLRES_IPV6 #else # define CURLRES_IPV4 diff --git a/lib/hostip4.c b/lib/hostip4.c index e6ba710d8..750e0dd5a 100644 --- a/lib/hostip4.c +++ b/lib/hostip4.c @@ -131,6 +131,16 @@ Curl_addrinfo *Curl_ipv4_resolve_r(const char *hostname, struct in_addr in; struct hostent *buf = NULL; +#ifdef ENABLE_IPV6 + { + struct in6_addr in6; + /* check if this is an IPv6 address string */ + if(Curl_inet_pton(AF_INET6, hostname, &in6) > 0) + /* This is an IPv6 address literal */ + return Curl_ip2addr(AF_INET6, &in6, hostname, port); + } +#endif /* ENABLE_IPV6 */ + if(Curl_inet_pton(AF_INET, hostname, &in) > 0) /* This is a dotted IP address 123.123.123.123-style */ return Curl_ip2addr(AF_INET, &in, hostname, port); diff --git a/tests/server/resolve.c b/tests/server/resolve.c index 4cbdba6ec..993e03125 100644 --- a/tests/server/resolve.c +++ b/tests/server/resolve.c @@ -68,7 +68,7 @@ int main(int argc, char *argv[]) while(argc>arg) { if(!strcmp("--version", argv[arg])) { printf("resolve IPv4%s\n", -#ifdef ENABLE_IPV6 +#if defined(CURLRES_IPV6) "/IPv6" #else "" @@ -95,7 +95,7 @@ int main(int argc, char *argv[]) puts("Usage: resolve [option] \n" " --version\n" " --ipv4" -#ifdef ENABLE_IPV6 +#if defined(CURLRES_IPV6) "\n --ipv6" #endif ); @@ -107,7 +107,7 @@ int main(int argc, char *argv[]) atexit(win32_cleanup); #endif -#ifdef ENABLE_IPV6 +#if defined(CURLRES_IPV6) if(use_ipv6) { /* Check that the system has IPv6 enabled before checking the resolver */ curl_socket_t s = socket(PF_INET6, SOCK_DGRAM, 0);