diff --git a/lib/ftp.c b/lib/ftp.c index 679f2334c..d79878e82 100644 --- a/lib/ftp.c +++ b/lib/ftp.c @@ -3083,10 +3083,9 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status, #endif if(conn->sock[SECONDARYSOCKET] != CURL_SOCKET_BAD) { - if(!result && ftpc->dont_check) - /* prevent some FTP servers (namely Pure-ftpd) from hanging if we close - * the data channel before transferring all data */ - result = Curl_pp_sendf(&ftpc->pp, "ABOR"); + if(!result && ftpc->dont_check && data->req.maxdownload > 0) + /* partial download completed */ + result = Curl_pp_sendf(pp, "ABOR"); if(conn->ssl[SECONDARYSOCKET].use) { /* The secondary socket is using SSL so we must close down that part @@ -3128,6 +3127,14 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status, if(result) return result; + if(ftpc->dont_check && data->req.maxdownload > 0) { + /* we have just sent ABOR and there is no reliable way to check if it was + * successful or not; we have to close the connection now */ + infof(data, "partial download completed, closing connection\n"); + conn->bits.close = TRUE; /* mark for closure */ + return result; + } + if(!ftpc->dont_check) { /* 226 Transfer complete, 250 Requested file action okay, completed. */ if((ftpcode != 226) && (ftpcode != 250)) { diff --git a/tests/data/test1036 b/tests/data/test1036 index a31cb458a..b8ebc4fc0 100644 --- a/tests/data/test1036 +++ b/tests/data/test1036 @@ -50,7 +50,6 @@ TYPE I SIZE 1036 REST 20 RETR 1036 -ABOR QUIT diff --git a/tests/data/test110 b/tests/data/test110 index 4a094e7e8..b63ba8a2d 100644 --- a/tests/data/test110 +++ b/tests/data/test110 @@ -46,7 +46,6 @@ TYPE I SIZE 110 REST 20 RETR 110 -ABOR QUIT diff --git a/tests/data/test122 b/tests/data/test122 index ac60672bb..fb1dd05fc 100644 --- a/tests/data/test122 +++ b/tests/data/test122 @@ -39,7 +39,6 @@ EPSV PASV TYPE I SIZE 122 -ABOR QUIT