aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2013-08-20 22:45:47 +0200
committerDaniel Stenberg <daniel@haxx.se>2013-08-29 23:09:31 +0200
commitc4a7ca038e26a57df952b4ea560f9b718a5ebd1d (patch)
tree158a29cc81bda796fc99be72913c9c49bc58299c
parent84f3b3dd448399f9548468676e1bd1475dba8de5 (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
-rw-r--r--lib/ftp.c38
1 files changed, 14 insertions, 24 deletions
diff --git a/lib/ftp.c b/lib/ftp.c
index 51ea99948..106b97201 100644
--- 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;