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 as well as IPv4 addresses in IPv6 format. Also, better handle the case
of a malformatted IPv6 address (avoid empty and NULL strings). 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) Daniel Stenberg (30 Jul 2008)
- Phil Blundell added the CURLOPT_SCOPE option, as well as adjusted the URL - 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 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 CURL_READFUNC_PAUSE problems fixed
o --use-ascii now works on Symbian OS, MS-DOS and OS/2 o --use-ascii now works on Symbian OS, MS-DOS and OS/2
o CURLINFO_SSL_VERIFYRESULT is fixed 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: This release includes the following known bugs:
@@ -60,7 +61,7 @@ advice from friends like these:
Rob Crittenden, Dengminwen, Christopher Palow, Hans-Jurgen May, Rob Crittenden, Dengminwen, Christopher Palow, Hans-Jurgen May,
Phil Pellouchoud, Eduard Bloch, John Lightsey, Stephen Collyer, Tor Arntsen, Phil Pellouchoud, Eduard Bloch, John Lightsey, Stephen Collyer, Tor Arntsen,
Rolland Dudemaine, Phil Blundell, Scott Barrett, Andreas Schuldei, 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) 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 * The conn->host.name is currently [user:passwd@]host[:port] where host
* could be a hostname, IPv4 address or IPv6 address. * 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)) { (']' == endbracket)) {
/* this is a RFC2732-style specified IP-address */ /* this is a RFC2732-style specified IP-address */
conn->bits.ipv6_ip = TRUE; 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 = strchr(conn->host.name, ']');
*tmp = 0; /* zero terminate */ *tmp++ = 0; /* zero terminate, killing the bracket */
tmp++; /* pass the ending bracket */
if(':' != *tmp) if(':' != *tmp)
tmp = NULL; /* no port number available */ tmp = NULL; /* no port number available */
} }
@@ -3887,9 +3886,18 @@ static CURLcode create_conn(struct SessionHandle *data,
if(conn->bits.httpproxy) { if(conn->bits.httpproxy) {
/* we need to create new URL with the new port number */ /* we need to create new URL with the new port number */
char *url; 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) if(!url)
return CURLE_OUT_OF_MEMORY; return CURLE_OUT_OF_MEMORY;