setopt: allow CURLOPT_INTERFACE to be set to NULL

Ref: https://github.com/curl/curl/discussions/14299#discussioncomment-10393909
Regression from 3060557af7 (shipped in 8.9.0)

Closes #14629
This commit is contained in:
Daniel Stenberg 2024-08-21 11:07:06 +02:00
parent 3065f106e3
commit b0b4b481b5
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
4 changed files with 19 additions and 21 deletions

View File

@ -511,32 +511,37 @@ void Curl_sndbuf_init(curl_socket_t sockfd)
* *
* Returns CURLE_OK on success. * 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) char **dev, char **iface, char **host)
{ {
static const char if_prefix[] = "if!"; static const char if_prefix[] = "if!";
static const char host_prefix[] = "host!"; static const char host_prefix[] = "host!";
static const char if_host_prefix[] = "ifhost!"; static const char if_host_prefix[] = "ifhost!";
size_t len;
DEBUGASSERT(dev); DEBUGASSERT(dev);
DEBUGASSERT(iface); DEBUGASSERT(iface);
DEBUGASSERT(host); 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); input += strlen(if_prefix);
if(!*input) if(!*input)
return CURLE_BAD_FUNCTION_ARGUMENT; return CURLE_BAD_FUNCTION_ARGUMENT;
*iface = Curl_memdup0(input, len - strlen(if_prefix)); *iface = Curl_memdup0(input, len - strlen(if_prefix));
return *iface ? CURLE_OK : CURLE_OUT_OF_MEMORY; 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); input += strlen(host_prefix);
if(!*input) if(!*input)
return CURLE_BAD_FUNCTION_ARGUMENT; return CURLE_BAD_FUNCTION_ARGUMENT;
*host = Curl_memdup0(input, len - strlen(host_prefix)); *host = Curl_memdup0(input, len - strlen(host_prefix));
return *host ? CURLE_OK : CURLE_OUT_OF_MEMORY; 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; const char *host_part;
input += strlen(if_host_prefix); input += strlen(if_host_prefix);
len -= strlen(if_host_prefix); len -= strlen(if_host_prefix);

View File

@ -57,7 +57,7 @@ struct Curl_sockaddr_ex {
/* /*
* Parse interface option, and return the interface name and the host part. * 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); char **dev, char **iface, char **host);
/* /*

View File

@ -139,30 +139,24 @@ static CURLcode setstropt_userpwd(char *option, char **userp, char **passwdp)
return CURLE_OK; return CURLE_OK;
} }
static CURLcode setstropt_interface( static CURLcode setstropt_interface(char *option, char **devp,
char *option, char **devp, char **ifacep, char **hostp) char **ifacep, char **hostp)
{ {
char *dev = NULL; char *dev = NULL;
char *iface = NULL; char *iface = NULL;
char *host = NULL; char *host = NULL;
size_t len;
CURLcode result; CURLcode result;
DEBUGASSERT(devp); DEBUGASSERT(devp);
DEBUGASSERT(ifacep); DEBUGASSERT(ifacep);
DEBUGASSERT(hostp); DEBUGASSERT(hostp);
/* Parse the interface details */ if(option) {
if(!option || !*option) /* Parse the interface details if set, otherwise clear them all */
return CURLE_BAD_FUNCTION_ARGUMENT; result = Curl_parse_interface(option, &dev, &iface, &host);
len = strlen(option);
if(len > 255)
return CURLE_BAD_FUNCTION_ARGUMENT;
result = Curl_parse_interface(option, len, &dev, &iface, &host);
if(result) if(result)
return result; return result;
}
free(*devp); free(*devp);
*devp = dev; *devp = dev;

View File

@ -58,8 +58,7 @@ static void test_parse(
char *dev = NULL; char *dev = NULL;
char *iface = NULL; char *iface = NULL;
char *host = NULL; char *host = NULL;
CURLcode rc = Curl_parse_interface( CURLcode rc = Curl_parse_interface(input, &dev, &iface, &host);
input, strlen(input), &dev, &iface, &host);
fail_unless(rc == exp_rc, "Curl_parse_interface() failed"); fail_unless(rc == exp_rc, "Curl_parse_interface() failed");
fail_unless(!!exp_dev == !!dev, "dev expectation failed."); fail_unless(!!exp_dev == !!dev, "dev expectation failed.");