1
0
mirror of https://github.com/moparisthebest/curl synced 2024-08-13 17:03:50 -04:00

urlapi: Fix port parsing of eol colon

A URL with a single colon without a portnumber should use the default
port, discarding the colon. Fix, add a testcase and also do little bit
of comment wordsmithing.

Closes #3365
Reviewed-by: Daniel Stenberg <daniel@haxx.se>
This commit is contained in:
Daniel Gustafsson 2018-12-12 11:45:09 +01:00
parent 4258dc02d8
commit d8607da1a6
2 changed files with 24 additions and 16 deletions

View File

@ -534,6 +534,14 @@ UNITTEST CURLUcode Curl_parse_port(struct Curl_URL *u, char *hostname)
long port;
char portbuf[7];
/* Browser behavior adaptation. If there's a colon with no digits after,
just cut off the name there which makes us ignore the colon and just
use the default port. Firefox, Chrome and Safari all do that. */
if(!portptr[1]) {
*portptr = '\0';
return CURLUE_OK;
}
if(!ISDIGIT(portptr[1]))
return CURLUE_BAD_PORT_NUMBER;
@ -547,22 +555,14 @@ UNITTEST CURLUcode Curl_parse_port(struct Curl_URL *u, char *hostname)
if(rest[0])
return CURLUE_BAD_PORT_NUMBER;
if(rest != &portptr[1]) {
*portptr++ = '\0'; /* cut off the name there */
*rest = 0;
/* generate a new to get rid of leading zeroes etc */
msnprintf(portbuf, sizeof(portbuf), "%ld", port);
u->portnum = port;
u->port = strdup(portbuf);
if(!u->port)
return CURLUE_OUT_OF_MEMORY;
}
else {
/* Browser behavior adaptation. If there's a colon with no digits after,
just cut off the name there which makes us ignore the colon and just
use the default port. Firefox and Chrome both do that. */
*portptr = '\0';
}
*portptr++ = '\0'; /* cut off the name there */
*rest = 0;
/* generate a new port number string to get rid of leading zeroes etc */
msnprintf(portbuf, sizeof(portbuf), "%ld", port);
u->portnum = port;
u->port = strdup(portbuf);
if(!u->port)
return CURLUE_OUT_OF_MEMORY;
}
return CURLUE_OK;

View File

@ -110,6 +110,14 @@ UNITTEST_START
free(ipv6port);
curl_url_cleanup(u);
/* Valid IPv6 with no port after the colon, should use default */
u = curl_url();
ipv6port = strdup("[fe80::250:56ff:fea7:da15]:");
ret = Curl_parse_port(u, ipv6port);
fail_unless(ret == CURLUE_OK, "Curl_parse_port returned error");
free(ipv6port);
curl_url_cleanup(u);
/* Incorrect zone index syntax */
u = curl_url();
ipv6port = strdup("[fe80::250:56ff:fea7:da15%!25eth3]:80");