mirror of
https://github.com/curl/curl.git
synced 2024-11-27 05:50:21 +08:00
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.
This commit is contained in:
parent
1e14da5c60
commit
e2f4656a86
33
lib/ftp.c
33
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;
|
||||
|
Loading…
Reference in New Issue
Block a user