Commit 63533cbd authored by Daniel Gustafsson's avatar Daniel Gustafsson
Browse files

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: default avatarDaniel Stenberg <daniel@haxx.se>
Reviewed-by: default avatarMarcel Raad <Marcel.Raad@teamviewer.com>
parent 552f0205
Loading
Loading
Loading
Loading
+20 −6
Original line number Diff line number Diff line
@@ -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)) {
    /* this is a RFC2732-style specified IP-address */
  /*
   * 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];
    if(*portptr) {
    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 */
    if(portptr && *portptr) {
      if(*portptr != ':')
        return CURLUE_MALFORMED_INPUT;
    }