1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-21 23:58:49 -05:00

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
This commit is contained in:
Daniel Stenberg 2013-08-20 22:45:47 +02:00
parent 84f3b3dd44
commit c4a7ca038e

View File

@ -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.
* 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(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];
If we're in another state, we're still handling commands on the control
(primary) connection.
*/
switch(ftpc->state) {
case FTP_STOP:
case FTP_STOR:
break;
default:
return GETSOCK_READSOCK(FIRSTSOCKET) |
GETSOCK_WRITESOCK(SECONDARYSOCKET);
}
else
return Curl_pp_getsock(&conn->proto.ftpc.pp, socks, numsocks);
}
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(0);
}
/* 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;