From c4a7ca038e26a57df952b4ea560f9b718a5ebd1d Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Tue, 20 Aug 2013 22:45:47 +0200 Subject: 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 --- lib/ftp.c | 38 ++++++++++++++------------------------ 1 file 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; -- cgit v1.2.3