Commit b4a5ce89 authored by Dan Fandrich's avatar Dan Fandrich
Browse files

Fixed a problem with any FTP URL or any URLs containing an IPv6 address

being mangled when passed to proxies when CURLOPT_PORT is also set
(reported by Pramod Sharma).
parent 66051691
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -11,6 +11,10 @@ Daniel Fandrich (31 Jul 2008)
  as well as IPv4 addresses in IPv6 format. Also, better handle the case
  of a malformatted IPv6 address (avoid empty and NULL strings).

- Fixed a problem with any FTP URL or any URLs containing an IPv6 address
  being mangled when passed to proxies when CURLOPT_PORT is also set
  (reported by Pramod Sharma).

Daniel Stenberg (30 Jul 2008)
- Phil Blundell added the CURLOPT_SCOPE option, as well as adjusted the URL
  parser to allow numerical IPv6-addresses to be specified with the scope
+2 −1
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ This release includes the following bugfixes:
 o CURL_READFUNC_PAUSE problems fixed
 o --use-ascii now works on Symbian OS, MS-DOS and OS/2
 o CURLINFO_SSL_VERIFYRESULT is fixed
 o FTP URLs and IPv6 URLs mangled when sent to proxy with CURLOPT_PORT set

This release includes the following known bugs:

@@ -60,7 +61,7 @@ advice from friends like these:
 Rob Crittenden, Dengminwen, Christopher Palow, Hans-Jurgen May,
 Phil Pellouchoud, Eduard Bloch, John Lightsey, Stephen Collyer, Tor Arntsen,
 Rolland Dudemaine, Phil Blundell, Scott Barrett, Andreas Schuldei,
 Peter Lamberg, David Bau
 Peter Lamberg, David Bau, Pramod Sharma


        Thanks! (and sorry if I forgot to mention someone)
+14 −6
Original line number Diff line number Diff line
@@ -3863,15 +3863,14 @@ static CURLcode create_conn(struct SessionHandle *data,
   * The conn->host.name is currently [user:passwd@]host[:port] where host
   * could be a hostname, IPv4 address or IPv6 address.
   *************************************************************/
  if((1 == sscanf(conn->host.name, "[%*39[0123456789abcdefABCDEF:.]%c", &endbracket)) &&
  if((1 == sscanf(conn->host.name, "[%*39[0123456789abcdefABCDEF:.%]%c", &endbracket)) &&
     (']' == endbracket)) {
    /* this is a RFC2732-style specified IP-address */
    conn->bits.ipv6_ip = TRUE;

    conn->host.name++; /* pass the starting bracket */
    conn->host.name++; /* skip over the starting bracket */
    tmp = strchr(conn->host.name, ']');
    *tmp = 0; /* zero terminate */
    tmp++; /* pass the ending bracket */
    *tmp++ = 0; /* zero terminate, killing the bracket */
    if(':' != *tmp)
      tmp = NULL; /* no port number available */
  }
@@ -3887,9 +3886,18 @@ static CURLcode create_conn(struct SessionHandle *data,
    if(conn->bits.httpproxy) {
      /* we need to create new URL with the new port number */
      char *url;
      bool isftp = strequal("ftp", conn->protostr) || 
                   strequal("ftps", conn->protostr);

      url = aprintf("%s://%s:%d%s", conn->protostr, conn->host.name,
                    conn->remote_port, data->state.path);
      /*
       * This synthesized URL isn't always right--suffixes like ;type=A
       * are stripped off. It would be better to work directly from the
       * original URL and simply replace the port part of it.
       */
      url = aprintf("%s://%s%s%s:%d%s%s", conn->protostr,
             conn->bits.ipv6_ip?"[":"", conn->host.name,
             conn->bits.ipv6_ip?"]":"", conn->remote_port, 
             isftp?"/":"", data->state.path);
      if(!url)
        return CURLE_OUT_OF_MEMORY;