Commit 0c8e5f7e authored by Kamil Dudka's avatar Kamil Dudka
Browse files

ftp: prevent server from hanging on closed data connection

Some FTP servers (e.g. Pure-ftpd) end up hanging if we close the data
connection before transferring all the requested data.  If we send ABOR
in that case, it prevents the server from hanging.

Bug: https://bugzilla.redhat.com/643656
Reported by: Pasi Karkkainen, Patrick Monnerat
parent 59db3190
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -3083,6 +3083,11 @@ 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(conn->ssl[SECONDARYSOCKET].use) {
      /* The secondary socket is using SSL so we must close down that part
         first before we close the socket for real */
@@ -3097,7 +3102,7 @@ static CURLcode ftp_done(struct connectdata *conn, CURLcode status,
    }
  }

  if((ftp->transfer == FTPTRANSFER_BODY) && ftpc->ctl_valid &&
  if(!result && (ftp->transfer == FTPTRANSFER_BODY) && ftpc->ctl_valid &&
     pp->pending_resp && !premature) {
    /*
     * Let's see what the server says about the transfer we just performed,
+1 −0
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ TYPE I
SIZE 1036
REST 20
RETR 1036
ABOR
QUIT
</protocol>
<file name="log/curl1036.out">
+1 −0
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ TYPE I
SIZE 1057
REST 52
RETR 1057
ABOR
QUIT
</protocol>
</verify>
+1 −0
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ TYPE I
SIZE 110
REST 20
RETR 110
ABOR
QUIT
</protocol>
</verify>
+1 −0
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ EPSV
PASV
TYPE I
SIZE 122
ABOR
QUIT
</protocol>
</verify>
Loading