diff options
author | Daniel Gustafsson <daniel@yesql.se> | 2018-12-12 11:45:09 +0100 |
---|---|---|
committer | Daniel Gustafsson <daniel@yesql.se> | 2018-12-12 11:48:04 +0100 |
commit | d8607da1a68f2482302ccdbb7cf457210b9ccfc9 (patch) | |
tree | 7cdaccafe732cc2e6925bc93c684754587ec1718 | |
parent | 4258dc02d86e7e4de9f795a1af3a0bc6732d4ab5 (diff) | |
download | curl-d8607da1a68f2482302ccdbb7cf457210b9ccfc9.tar.gz |
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>
-rw-r--r-- | lib/urlapi.c | 32 | ||||
-rw-r--r-- | tests/unit/unit1653.c | 8 |
2 files changed, 24 insertions, 16 deletions
diff --git a/lib/urlapi.c b/lib/urlapi.c index 5cbda6a98..e68748818 100644 --- a/lib/urlapi.c +++ b/lib/urlapi.c @@ -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; diff --git a/tests/unit/unit1653.c b/tests/unit/unit1653.c index 9851ee58c..b68d8dc4f 100644 --- a/tests/unit/unit1653.c +++ b/tests/unit/unit1653.c @@ -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"); |