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).
This commit is contained in:
Dan Fandrich 2008-07-31 22:46:29 +00:00
parent 660516914e
commit b4a5ce89c2
3 changed files with 20 additions and 7 deletions

View File

@ -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

View File

@ -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)

View File

@ -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;