From: Christos Tsantilas Date: Wed, 4 Jun 2014 08:43:48 +0000 (+0300) Subject: Fix assertion on bodyPipe != NULL inside ConnStateData::handleFtpRequestData() X-Git-Tag: SQUID_3_5_0_1~117^2~14 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=84aa17d81cdcad77f11f1810b7f524ddf782ac3c;p=thirdparty%2Fsquid.git Fix assertion on bodyPipe != NULL inside ConnStateData::handleFtpRequestData() 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. --- diff --git a/src/client_side.cc b/src/client_side.cc index 38ae573a1d..b3af191854 100644 --- a/src/client_side.cc +++ b/src/client_side.cc @@ -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); }