]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
ftp: make domore_getsock() return the secondary socket properly
authorDaniel Stenberg <daniel@haxx.se>
Thu, 14 May 2020 22:40:25 +0000 (00:40 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Fri, 15 May 2020 06:28:56 +0000 (08:28 +0200)
Previously, after PASV and immediately after the data connection has
connected, the function would only return the control socket to wait for
which then made the data connection simply timeout and not get polled
correctly. This become obvious when running test 1631 and 1632 event-
based.

lib/ftp.c

index 289dab259070825898b1bb6fcdf0790c0e1551d7..c8c7968bb2f2789cd4db213148f1c207d75b25e4 100644 (file)
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -816,6 +816,7 @@ static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks)
 
   if(FTP_STOP == ftpc->state) {
     int bits = GETSOCK_READSOCK(0);
+    bool any = FALSE;
 
     /* if stopped and still in this state, then we're also waiting for a
        connect on the secondary connection */
@@ -830,10 +831,11 @@ static int ftp_domore_getsock(struct connectdata *conn, curl_socket_t *socks)
         if(conn->tempsock[i] != CURL_SOCKET_BAD) {
           socks[s] = conn->tempsock[i];
           bits |= GETSOCK_WRITESOCK(s++);
+          any = TRUE;
         }
       }
     }
-    else {
+    if(!any) {
       socks[1] = conn->sock[SECONDARYSOCKET];
       bits |= GETSOCK_WRITESOCK(1) | GETSOCK_READSOCK(1);
     }