urlapi: fix parsing ipv6 with zone index

The previous fix for parsing IPv6 URLs with a zone index was a paddle
short for URLs without an explicit port. This patch fixes that case
and adds a unit test case.

This bug was highlighted by issue #3408, and while it's not the full
fix for the problem there it is an isolated bug that should be fixed
regardless.

Closes #3411
Reported-by: GitYuanQu on github
Reviewed-by: Daniel Stenberg <daniel@haxx.se>
This commit is contained in:
Daniel Gustafsson 2018-12-30 20:11:57 +01:00
parent 2a8801d7ba
commit a4482b21bd
2 changed files with 13 additions and 2 deletions

View File

@ -510,8 +510,11 @@ UNITTEST CURLUcode Curl_parse_port(struct Curl_URL *u, char *hostname)
portptr = &hostname[len];
else if('%' == endbracket) {
int zonelen = len;
if(1 == sscanf(hostname + zonelen, "25%*[^]]]%c%n", &endbracket, &len))
portptr = &hostname[--zonelen + len];
if(1 == sscanf(hostname + zonelen, "25%*[^]]%c%n", &endbracket, &len)) {
if(']' != endbracket)
return CURLUE_MALFORMED_INPUT;
portptr = &hostname[--zonelen + len + 1];
}
else
return CURLUE_MALFORMED_INPUT;
}

View File

@ -83,6 +83,14 @@ UNITTEST_START
free(ipv6port);
curl_url_cleanup(u);
/* Valid IPv6 with zone index without port number */
u = curl_url();
ipv6port = strdup("[fe80::250:56ff:fea7:da15%25eth3]");
ret = Curl_parse_port(u, ipv6port);
fail_unless(ret == CURLUE_OK, "Curl_parse_port returned error");
free(ipv6port);
curl_url_cleanup(u);
/* Valid IPv6 with port number */
u = curl_url();
ipv6port = strdup("[fe80::250:56ff:fea7:da15]:81");