FTP: wait on both connections during active STOR state
authorDaniel Stenberg <daniel@haxx.se>
Fri, 5 Apr 2013 06:39:24 +0000 (08:39 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Sat, 6 Apr 2013 15:21:38 +0000 (17:21 +0200)
When doing PORT and upload (STOR), this function needs to extract the
file descriptor for both connections so that it will respond immediately
when the server eventually connects back.

This flaw caused active connections to become unnecessary slow but they
would still often work due to the normal polling on a timeout. The bug
also would not occur if the server connected back very fast, like when
testing on local networks.

Bug: http://curl.haxx.se/bug/view.cgi?id=1183
Reported by: Daniel Theron

lib/ftp.c

index e490dd206e584641b5785a7a0c6f6ee63159fa8f..0b2e5cce4469240cb9a33cf97a5adebeb16225d4 100644 (file)
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -878,14 +878,16 @@ static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks,
      remote site, or we could wait for that site to connect to us. Or just
      handle ordinary commands.
 
-     When waiting for a connect, we will be in FTP_STOP state and then we wait
-     for the secondary socket to become writeable. If we're in another state,
-     we're still handling commands on the control (primary) connection.
+     When waiting for a connect, we can be in FTP_STOP state (or we're in
+     FTP_STOR when we do an upload) and then we wait for the secondary socket
+     to become writeable. . If we're in another state, we're still handling
+     commands on the control (primary) connection.
 
   */
 
   switch(ftpc->state) {
   case FTP_STOP:
+  case FTP_STOR:
     break;
   default:
     return Curl_pp_getsock(&conn->proto.ftpc.pp, socks, numsocks);