From: Daniel Stenberg Date: Wed, 21 Aug 2024 09:07:06 +0000 (+0200) Subject: setopt: allow CURLOPT_INTERFACE to be set to NULL X-Git-Tag: curl-8_10_0~169 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b0b4b481b5b6e210a416ebbe16c2b8a77678e85d;p=thirdparty%2Fcurl.git setopt: allow CURLOPT_INTERFACE to be set to NULL Ref: https://github.com/curl/curl/discussions/14299#discussioncomment-10393909 Regression from 3060557af702dd591 (shipped in 8.9.0) Closes #14629 --- diff --git a/lib/cf-socket.c b/lib/cf-socket.c index 3f0fb32bf8..c1f1ac866e 100644 --- a/lib/cf-socket.c +++ b/lib/cf-socket.c @@ -511,32 +511,37 @@ void Curl_sndbuf_init(curl_socket_t sockfd) * * Returns CURLE_OK on success. */ -CURLcode Curl_parse_interface(const char *input, size_t len, +CURLcode Curl_parse_interface(const char *input, char **dev, char **iface, char **host) { static const char if_prefix[] = "if!"; static const char host_prefix[] = "host!"; static const char if_host_prefix[] = "ifhost!"; + size_t len; DEBUGASSERT(dev); DEBUGASSERT(iface); DEBUGASSERT(host); - if(strncmp(if_prefix, input, strlen(if_prefix)) == 0) { + len = strlen(input); + if(len > 512) + return CURLE_BAD_FUNCTION_ARGUMENT; + + if(!strncmp(if_prefix, input, strlen(if_prefix))) { input += strlen(if_prefix); if(!*input) return CURLE_BAD_FUNCTION_ARGUMENT; *iface = Curl_memdup0(input, len - strlen(if_prefix)); return *iface ? CURLE_OK : CURLE_OUT_OF_MEMORY; } - if(strncmp(host_prefix, input, strlen(host_prefix)) == 0) { + else if(!strncmp(host_prefix, input, strlen(host_prefix))) { input += strlen(host_prefix); if(!*input) return CURLE_BAD_FUNCTION_ARGUMENT; *host = Curl_memdup0(input, len - strlen(host_prefix)); return *host ? CURLE_OK : CURLE_OUT_OF_MEMORY; } - if(strncmp(if_host_prefix, input, strlen(if_host_prefix)) == 0) { + else if(!strncmp(if_host_prefix, input, strlen(if_host_prefix))) { const char *host_part; input += strlen(if_host_prefix); len -= strlen(if_host_prefix); diff --git a/lib/cf-socket.h b/lib/cf-socket.h index 6040058b09..35225f153c 100644 --- a/lib/cf-socket.h +++ b/lib/cf-socket.h @@ -57,7 +57,7 @@ struct Curl_sockaddr_ex { /* * Parse interface option, and return the interface name and the host part. */ -CURLcode Curl_parse_interface(const char *input, size_t len, +CURLcode Curl_parse_interface(const char *input, char **dev, char **iface, char **host); /* diff --git a/lib/setopt.c b/lib/setopt.c index 538bd52ad8..9d695e09d3 100644 --- a/lib/setopt.c +++ b/lib/setopt.c @@ -139,30 +139,24 @@ static CURLcode setstropt_userpwd(char *option, char **userp, char **passwdp) return CURLE_OK; } -static CURLcode setstropt_interface( - char *option, char **devp, char **ifacep, char **hostp) +static CURLcode setstropt_interface(char *option, char **devp, + char **ifacep, char **hostp) { char *dev = NULL; char *iface = NULL; char *host = NULL; - size_t len; CURLcode result; DEBUGASSERT(devp); DEBUGASSERT(ifacep); DEBUGASSERT(hostp); - /* Parse the interface details */ - if(!option || !*option) - return CURLE_BAD_FUNCTION_ARGUMENT; - len = strlen(option); - if(len > 255) - return CURLE_BAD_FUNCTION_ARGUMENT; - - result = Curl_parse_interface(option, len, &dev, &iface, &host); - if(result) - return result; - + if(option) { + /* Parse the interface details if set, otherwise clear them all */ + result = Curl_parse_interface(option, &dev, &iface, &host); + if(result) + return result; + } free(*devp); *devp = dev; diff --git a/tests/unit/unit1663.c b/tests/unit/unit1663.c index f4801fe5cc..e7fe621666 100644 --- a/tests/unit/unit1663.c +++ b/tests/unit/unit1663.c @@ -58,8 +58,7 @@ static void test_parse( char *dev = NULL; char *iface = NULL; char *host = NULL; - CURLcode rc = Curl_parse_interface( - input, strlen(input), &dev, &iface, &host); + CURLcode rc = Curl_parse_interface(input, &dev, &iface, &host); fail_unless(rc == exp_rc, "Curl_parse_interface() failed"); fail_unless(!!exp_dev == !!dev, "dev expectation failed.");