diff --git a/CHANGES b/CHANGES index d10d2b2bd..879f4d9fd 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,13 @@ Changelog +Daniel (6 December 2004) +- Richard Atterer fixed libcurl's way of dealing with the EPSV + response. Previously, libcurl would re-resolve the host name with the new + port number and attempt to connect to that, while it should use the IP from + the control channel. This bug made it hard to EPSV from an FTP server with + multiple IP addresses! + Daniel (3 December 2004) - Bug report #1078066: when a chunked transfer was pre-maturely closed exactly at a chunk boundary it was not considered an error and thus went unnoticed. diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 3d1626cd2..dd909bc44 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -23,6 +23,7 @@ This release includes the following changes: This release includes the following bugfixes: + o EPSV on multi-homed servers now works correctly o chunked-encoded transfers could get closed pre-maturely without error o proxy CONNECT now default timeouts after 3600 seconds o --disable-epsv and --disable-eprt are ignored when connecting to an IPv6 ftp @@ -57,6 +58,7 @@ advice from friends like these: Peter Wullinger, Guillaume Arluison, Alexander Krasnostavsky, Mohun Biswas, Tomas Pospisek, Gisle Vanem, Dan Fandrich, Paul Nolan, Andres Garcia, Tim Sneddon, Ian Gulliver, Jean-Philippe Barrette-LaPierre, Jeff Phillips, - Wojciech Zwiefka, David Phillips, Reinout van Schouwen, Maurice Barnum + Wojciech Zwiefka, David Phillips, Reinout van Schouwen, Maurice Barnum, + Richard Atterer Thanks! (and sorry if I forgot to mention someone) diff --git a/lib/ftp.c b/lib/ftp.c index 47cb361aa..cc667acdb 100644 --- a/lib/ftp.c +++ b/lib/ftp.c @@ -1519,8 +1519,8 @@ CURLcode ftp_use_pasv(struct connectdata *conn, /* newhost must be able to hold a full IP-style address in ASCII, which in the IPv6 case means 5*8-1 = 39 letters */ - char newhost[48]; - char *newhostp=NULL; +#define NEWHOST_BUFSIZE 48 + char newhost[NEWHOST_BUFSIZE]; #ifdef PF_INET6 if(!conn->bits.ftp_use_epsv && @@ -1584,7 +1584,6 @@ CURLcode ftp_use_pasv(struct connectdata *conn, snprintf(newhost, sizeof(newhost), "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]); - newhostp = newhost; newport = (port[0]<<8) + port[1]; } else if (229 == results[modeoff]) { @@ -1613,8 +1612,8 @@ CURLcode ftp_use_pasv(struct connectdata *conn, if(ptr) { newport = num; - /* we should use the same host we already are connected to */ - newhostp = conn->host.name; + /* We must use the same IP we are already connected to */ + Curl_printable_address(conn->ip_addr, newhost, NEWHOST_BUFSIZE); } } else @@ -1646,12 +1645,12 @@ CURLcode ftp_use_pasv(struct connectdata *conn, } else { /* normal, direct, ftp connection */ - rc = Curl_resolv(conn, newhostp, newport, &addr); + rc = Curl_resolv(conn, newhost, newport, &addr); if(rc == CURLRESOLV_PENDING) rc = Curl_wait_for_resolv(conn, &addr); if(!addr) { - failf(data, "Can't resolve new host %s:%d", newhostp, newport); + failf(data, "Can't resolve new host %s:%d", newhost, newport); return CURLE_FTP_CANT_GET_HOST; } connectport = newport; /* we connect to the remote port */ @@ -1676,13 +1675,13 @@ CURLcode ftp_use_pasv(struct connectdata *conn, if(data->set.verbose) /* this just dumps information about this second connection */ - ftp_pasv_verbose(conn, conninfo, newhostp, connectport); + ftp_pasv_verbose(conn, conninfo, newhost, connectport); #ifndef CURL_DISABLE_HTTP if(conn->bits.tunnel_proxy) { /* We want "seamless" FTP operations through HTTP proxy tunnel */ result = Curl_ConnectHTTPProxyTunnel(conn, SECONDARYSOCKET, - newhostp, newport); + newhost, newport); if(CURLE_OK != result) return result; }