]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Fix assertion on bodyPipe != NULL inside ConnStateData::handleFtpRequestData()
authorChristos Tsantilas <chtsanti@users.sourceforge.net>
Wed, 4 Jun 2014 08:43:48 +0000 (11:43 +0300)
committerChristos Tsantilas <chtsanti@users.sourceforge.net>
Wed, 4 Jun 2014 08:43:48 +0000 (11:43 +0300)
ftp-native branch hits this assertion when ICAP server respond with error on
a ftp request.
This patch closes the data connection on these cases and also add a check in
ConnStateData::clientReadFtpData to avoid calling handleFtpRequestData when
the bodyPipe is gone for a reason.

src/client_side.cc

index 38ae573a1d5667808aa249e38d449009eefea46b..b3af1918546097b8fc9f39b39dd658bab342db99 100644 (file)
@@ -3243,7 +3243,7 @@ ConnStateData::clientReadFtpData(const CommIoCbParams &io)
     assert(Comm::IsConnOpen(ftp.dataConn));
     assert(io.conn->fd == ftp.dataConn->fd);
 
-    if (io.flag == COMM_OK) {
+    if (io.flag == COMM_OK && bodyPipe != NULL) {
         if (io.size > 0) {
             kb_incr(&(statCounter.client_http.kbytes_in), io.size);
 
@@ -3258,7 +3258,7 @@ ConnStateData::clientReadFtpData(const CommIoCbParams &io)
             if (ftp.uploadAvailSize <= 0)
                 finishDechunkingRequest(true);
         }
-    } else {
+    } else { //not COMM_OK or unexpected read
         debugs(33, 5, HERE << io.conn << " closed");
         FtpCloseDataConnection(this);
         finishDechunkingRequest(false);
@@ -5660,6 +5660,8 @@ FtpWriteForwardedForeign(ClientSocketContext *context, const HttpReply *reply)
 {
     ConnStateData *const connState = context->getConn();
     FtpChangeState(connState, ConnStateData::FTP_CONNECTED, "foreign reply");
+    //Close the data connection.
+    FtpCloseDataConnection(connState);
     // 451: We intend to keep the control connection open.
     FtpWriteErrorReply(context, reply, 451);
 }