summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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");