diff options
author | Anton Malov <malov.anton@gmail.com> | 2012-11-12 16:06:31 +0400 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2012-11-12 23:00:27 +0100 |
commit | 076e1fa3486225aaec50e091784cd2f74cbcff5d (patch) | |
tree | c1e0ec6499c9e4b122ce3020d7bf2d0642715daf /lib | |
parent | cd5261ea6d66b54754125e0ffe0b38e4c688e1b0 (diff) |
ftp: EPSV-disable fix over SOCKS
Bug: http://curl.haxx.se/bug/view.cgi?id=3586338
Diffstat (limited to 'lib')
-rw-r--r-- | lib/ftp.c | 38 |
1 files changed, 25 insertions, 13 deletions
@@ -1800,6 +1800,23 @@ static CURLcode ftp_state_quote(struct connectdata *conn, return result; } +/* called from ftp_state_pasv_resp to switch to PASV in case of EPSV + problems */ +static CURLcode ftp_epsv_disable(struct connectdata *conn) +{ + CURLcode result = CURLE_OK; + infof(conn->data, "got positive EPSV response, but can't connect. " + "Disabling EPSV\n"); + /* disable it for next transfer */ + conn->bits.ftp_use_epsv = FALSE; + conn->data->state.errorbuf = FALSE; /* allow error message to get + rewritten */ + PPSENDF(&conn->proto.ftpc.pp, "PASV", NULL); + conn->proto.ftpc.count1++; + /* remain in the FTP_PASV state */ + return result; +} + static CURLcode ftp_state_pasv_resp(struct connectdata *conn, int ftpcode) { @@ -1982,20 +1999,12 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn, Curl_resolv_unlock(data, addr); /* we're done using this address */ - if(result && ftpc->count1 == 0 && ftpcode == 229) { - infof(data, "got positive EPSV response, but can't connect. " - "Disabling EPSV\n"); - /* disable it for next transfer */ - conn->bits.ftp_use_epsv = FALSE; - data->state.errorbuf = FALSE; /* allow error message to get rewritten */ - PPSENDF(&ftpc->pp, "PASV", NULL); - ftpc->count1++; - /* remain in the FTP_PASV state */ - return result; - } + if(result) { + if(ftpc->count1 == 0 && ftpcode == 229) + return ftp_epsv_disable(conn); - if(result) return result; + } conn->bits.tcpconnect[SECONDARYSOCKET] = connected; @@ -2035,8 +2044,11 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn, break; } - if(result) + if(result) { + if(ftpc->count1 == 0 && ftpcode == 229) + return ftp_epsv_disable(conn); return result; + } if(conn->bits.tunnel_proxy && conn->bits.httpproxy) { /* FIX: this MUST wait for a proper connect first if 'connected' is |