diff options
-rw-r--r-- | CHANGES | 16 | ||||
-rw-r--r-- | RELEASE-NOTES | 5 | ||||
-rw-r--r-- | lib/ftp.c | 15 |
3 files changed, 31 insertions, 5 deletions
@@ -7,6 +7,22 @@ Changelog Daniel (5 December 2006) +- Alexey Simak filed bug report #1600447 + (http://curl.haxx.se/bug/view.cgi?id=1600447) in which he noted that active + FTP connections don't work with the multi interface. The problem is here + that the multi interface state machine has a state during which it can wait + for the data connection to connect, but the active connection is not done in + the same step in the sequence as the passive one is so it doesn't quite work + for active. The active FTP code still use a blocking function to allow the + remote server to connect. + + The fix (work-around is a better word) for this problem is to set the + boolean prematurely that the data connection is completed, so that the "wait + for connect" phase ends at once. + + The proper fix, left for the future, is of course to make the active FTP + case to act in a non-blocking way too. + - Matt Witherspoon fixed a problem case when the CPU load went to 100% when a HTTP upload was disconnected: diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 28cf5837f..2db25e372 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -26,7 +26,8 @@ This release includes the following bugfixes: o HTTP responses on persistent connections without Content-Length nor chunked encoding are now considered to be without response body o Content-Range: header parsing improved - o CPU 100% load when upload connection broke + o CPU 100% load when HTTP upload connection broke + o active FTP didn't work with multi interface Other curl-related news: @@ -44,6 +45,6 @@ advice from friends like these: James Housley, Olaf Stueben, Yang Tse, Gisle Vanem, Bradford Bruce, Ciprian Badescu, Dmitriy Sergeyev, Nir Soffer, Venkat Akella, Toon Verwaest, - Matt Witherspoon + Matt Witherspoon, Alexey Simak Thanks! (and sorry if I forgot to mention someone) @@ -573,7 +573,7 @@ CURLcode Curl_GetFTPResponse(ssize_t *nreadp, /* return number of bytes read */ /* output debug output if that is requested */ if(data->set.verbose) - Curl_debug(data, CURLINFO_HEADER_IN, + Curl_debug(data, CURLINFO_HEADER_IN, line_start, (size_t)perline, conn); /* @@ -1168,6 +1168,15 @@ static CURLcode ftp_state_use_port(struct connectdata *conn, #endif /* end of ipv4-specific code */ + /* this tcpconnect assignment below is a hackish work-around to make the + multi interface with active FTP work - as it will not wait for a + (passive) connect in Curl_is_connected(). + + The *proper* fix is to make sure that the active connection from the + server is done in a non-blocking way. Currently, it is still BLOCKING. + */ + conn->bits.tcpconnect = TRUE; + state(conn, FTP_PORT); return result; } @@ -3433,7 +3442,7 @@ CURLcode Curl_nbftpsendf(struct connectdata *conn, return res; if(conn->data->set.verbose) - Curl_debug(conn->data, CURLINFO_HEADER_OUT, + Curl_debug(conn->data, CURLINFO_HEADER_OUT, sptr, (size_t)bytes_written, conn); if(bytes_written != (ssize_t)write_len) { @@ -3491,7 +3500,7 @@ CURLcode Curl_ftpsendf(struct connectdata *conn, break; if(conn->data->set.verbose) - Curl_debug(conn->data, CURLINFO_HEADER_OUT, + Curl_debug(conn->data, CURLINFO_HEADER_OUT, sptr, (size_t)bytes_written, conn); if(bytes_written != (ssize_t)write_len) { |