]> granicus.if.org Git - curl/commitdiff
FTP: fix getsock during DO_MORE state
authorDaniel Stenberg <daniel@haxx.se>
Tue, 20 Aug 2013 20:45:47 +0000 (22:45 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Thu, 29 Aug 2013 21:09:31 +0000 (23:09 +0200)
... when doing upload it would return the wrong values at times. This
commit attempts to cleanup the mess.

Bug: http://curl.haxx.se/mail/lib-2013-08/0109.html
Reported-by: Mike Mio
lib/ftp.c

index 51ea99948aca3c064a6aae245f754845fb5a56e5..106b97201716d83f94aa942b0eb383da77734163 100644 (file)
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -872,33 +872,21 @@ static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks,
     return GETSOCK_BLANK;
 
   /* When in DO_MORE state, we could be either waiting for us to connect to a
-     remote site, or we could wait for that site to connect to us. Or just
-     handle ordinary commands.
-
-     When waiting for a connect (in PORT mode), 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 STOR or STOP in passive
-     mode, we already have the seconnd connection done.
-
-     If we're in another state, we're still handling commands on the control
-     (primary) connection.
-  */
+   * remote site, or we could wait for that site to connect to us. Or just
+   * handle ordinary commands.
+   */
 
-  switch(ftpc->state) {
-  case FTP_STOP:
-  case FTP_STOR:
-    break;
-  default:
-    return Curl_pp_getsock(&conn->proto.ftpc.pp, socks, numsocks);
-  }
+  if(FTP_STOP == ftpc->state) {
+    /* if stopped and still in this state, then we're also waiting for a
+       connect on the secondary connection */
+    socks[0] = conn->sock[FIRSTSOCKET];
+    socks[1] = conn->sock[SECONDARYSOCKET];
 
-  socks[0] = conn->sock[SECONDARYSOCKET];
-  if(ftpc->wait_data_conn || !conn->data->set.ftp_use_port) {
-    socks[1] = conn->sock[FIRSTSOCKET];
-    return GETSOCK_READSOCK(0) | GETSOCK_READSOCK(1);
+    return GETSOCK_READSOCK(FIRSTSOCKET) |
+      GETSOCK_WRITESOCK(SECONDARYSOCKET);
   }
-
-  return GETSOCK_READSOCK(0);
+  else
+    return Curl_pp_getsock(&conn->proto.ftpc.pp, socks, numsocks);
 }
 
 /* This is called after the FTP_QUOTE state is passed.
@@ -2427,6 +2415,8 @@ static CURLcode ftp_state_stor_resp(struct connectdata *conn,
   if(data->set.ftp_use_port) {
     bool connected;
 
+    state(conn, FTP_STOP); /* no longer in STOR state */
+
     result = AllowServerConnect(conn, &connected);
     if(result)
       return result;