From e2f4656a8696480514f5096ff9ea64aa3129934a Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Fri, 23 May 2003 11:14:09 +0000 Subject: Ricardo Cadime found a socket leak when listing directories without contents. Test cases 144 and 145 were added to verify the fix. Now we deal with return code 450 properly and other codes also do proper cleanup. --- lib/ftp.c | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/lib/ftp.c b/lib/ftp.c index 885ad243c..6fa2982a0 100644 --- a/lib/ftp.c +++ b/lib/ftp.c @@ -1184,7 +1184,6 @@ CURLcode ftp_use_port(struct connectdata *conn) return result; if (ftpcode != 200) { - failf(data, "Server does not grok %s", *modep); continue; } else @@ -1193,6 +1192,7 @@ CURLcode ftp_use_port(struct connectdata *conn) if (!*modep) { sclose(portsock); + failf(data, "PORT command attempts failed"); return CURLE_FTP_PORT_FAILED; } /* we set the secondary socket variable to this for now, it @@ -1931,8 +1931,14 @@ CURLcode Curl_ftp_nextconnect(struct connectdata *conn) return result; } else { - failf(data, "%s", buf+4); - return CURLE_FTP_COULDNT_RETR_FILE; + if(dirlist && (ftpcode == 450)) { + /* simply no matching files */ + ftp->no_transfer = TRUE; /* don't think we should download anything */ + } + else { + failf(data, "%s", buf+4); + return CURLE_FTP_COULDNT_RETR_FILE; + } } } @@ -2180,16 +2186,19 @@ CURLcode Curl_ftp(struct connectdata *conn) if(CURLE_OK == retcode) { if(connected) retcode = Curl_ftp_nextconnect(conn); - else { - if(ftp->no_transfer) { - /* no data to transfer */ - retcode=Curl_Transfer(conn, -1, -1, FALSE, NULL, -1, NULL); - } - else { - /* since we didn't connect now, we want do_more to get called */ - conn->bits.do_more = TRUE; - } + + if(retcode && (conn->secondarysocket >= 0)) { + /* Failure detected, close the second socket if it was created already */ + sclose(conn->secondarysocket); + conn->secondarysocket = -1; } + + if(ftp->no_transfer) + /* no data to transfer */ + retcode=Curl_Transfer(conn, -1, -1, FALSE, NULL, -1, NULL); + else if(!connected) + /* since we didn't connect now, we want do_more to get called */ + conn->bits.do_more = TRUE; } return retcode; -- cgit v1.2.3