summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Gustafsson <daniel@yesql.se>2018-12-12 11:45:09 +0100
committerDaniel Gustafsson <daniel@yesql.se>2018-12-12 11:48:04 +0100
commitd8607da1a68f2482302ccdbb7cf457210b9ccfc9 (patch)
tree7cdaccafe732cc2e6925bc93c684754587ec1718
parent4258dc02d86e7e4de9f795a1af3a0bc6732d4ab5 (diff)
downloadcurl-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.c32
-rw-r--r--tests/unit/unit1653.c8
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");