urlapi: fix portnumber parsing for ipv6 zone index

An IPv6 URL which contains a zone index includes a '%%25<zode id>'
string before the ending ']' bracket. The parsing logic wasn't set
up to cope with the zone index however, resulting in a malformed url
error being returned. Fix by breaking the parsing into two stages
to correctly handle the zone index.

Closes #3355
Closes #3319
Reported-by: tonystz on Github
Reviewed-by: Daniel Stenberg <daniel@haxx.se>
Reviewed-by: Marcel Raad <Marcel.Raad@teamviewer.com>
This commit is contained in:
Daniel Gustafsson 2018-12-11 15:02:19 +01:00
parent 552f0205e6
commit 63533cbde2
1 changed files with 20 additions and 6 deletions

View File

@ -490,16 +490,30 @@ static CURLUcode parse_hostname_login(struct Curl_URL *u,
static CURLUcode parse_port(struct Curl_URL *u, char *hostname)
{
char *portptr;
char *portptr = NULL;
char endbracket;
int len;
if((1 == sscanf(hostname, "[%*45[0123456789abcdefABCDEF:.%%]%c%n",
&endbracket, &len)) &&
(']' == endbracket)) {
/*
* Find the end of an IPv6 address, either on the ']' ending bracket or
* a percent-encoded zone index.
*/
if(1 == sscanf(hostname, "[%*45[0123456789abcdefABCDEF:.]%c%n",
&endbracket, &len)) {
if(']' == endbracket)
portptr = &hostname[len];
else if('%' == endbracket) {
int zonelen = len;
if(1 == sscanf(hostname + zonelen, "25%*[^]]]%c%n", &endbracket, &len))
portptr = &hostname[--zonelen + len];
else
return CURLUE_MALFORMED_INPUT;
}
else
return CURLUE_MALFORMED_INPUT;
/* this is a RFC2732-style specified IP-address */
portptr = &hostname[len];
if(*portptr) {
if(portptr && *portptr) {
if(*portptr != ':')
return CURLUE_MALFORMED_INPUT;
}