diff options
author | Daniel Stenberg <daniel@haxx.se> | 2013-08-20 22:45:47 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2013-08-29 23:09:31 +0200 |
commit | c4a7ca038e26a57df952b4ea560f9b718a5ebd1d (patch) | |
tree | 158a29cc81bda796fc99be72913c9c49bc58299c /lib | |
parent | 84f3b3dd448399f9548468676e1bd1475dba8de5 (diff) |
FTP: fix getsock during DO_MORE state
... 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
Diffstat (limited to 'lib')
-rw-r--r-- | lib/ftp.c | 38 |
1 files changed, 14 insertions, 24 deletions
@@ -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; |