From: Alex Rousskov Date: Fri, 23 Aug 2013 17:52:12 +0000 (-0600) Subject: Fixed client_side.cc "context->socketState() == STREAM_COMPLETE" assertion X-Git-Tag: SQUID_3_5_0_1~117^2~60 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=84ff6702cca29d9e7305e0a9cf0fcccc83aa588c;p=thirdparty%2Fsquid.git Fixed client_side.cc "context->socketState() == STREAM_COMPLETE" assertion on client-aborted downloads. Improved debugging. --- diff --git a/src/client_side.cc b/src/client_side.cc index 68bc1f3ff2..5ac84ce4d2 100644 --- a/src/client_side.cc +++ b/src/client_side.cc @@ -4925,6 +4925,10 @@ FtpWriteEarlyReply(ConnStateData *connState, const int code, const char *msg) static void FtpWriteReply(ClientSocketContext *context, MemBuf &mb) { + debugs(11, 2, "FTP Client " << context->clientConnection); + debugs(11, 2, "FTP Client REPLY:\n---------\n" << mb.buf << + "\n----------"); + AsyncCall::Pointer call = commCbCall(33, 5, "FtpWroteReply", CommIoCbPtrFun(&FtpWroteReply, context)); Comm::Write(context->clientConnection, &mb, call); @@ -5084,15 +5088,6 @@ FtpParseRequest(ConnStateData *connState, HttpRequestMethod *method_p, Http::Pro static void FtpHandleReply(ClientSocketContext *context, HttpReply *reply, StoreIOBuffer data) { - // XXX: in some cases (e.g., FtpHandlePasvReply), the reply is not what we send to the client - if (reply != NULL) { - MemBuf *const mb = reply->pack(); - debugs(11, 2, "FTP Client " << context->clientConnection); - debugs(11, 2, "FTP Client REPLY:\n---------\n" << mb->buf << - "\n----------"); - delete mb; - } - static FtpReplyHandler *handlers[] = { NULL, // FTP_BEGIN NULL, // FTP_CONNECTED @@ -5311,6 +5306,10 @@ FtpWriteForwardedReply(ClientSocketContext *context, const HttpReply *reply, Asy mb.init(); FtpPrintReply(mb, reply); + debugs(11, 2, "FTP Client " << context->clientConnection); + debugs(11, 2, "FTP Client REPLY:\n---------\n" << mb.buf << + "\n----------"); + Comm::Write(context->clientConnection, &mb, call); } @@ -5373,7 +5372,8 @@ FtpWroteReply(const Comm::ConnectionPointer &conn, char *bufnotused, size_t size static_cast(data); ConnStateData *const connState = context->getConn(); - if (connState->ftp.state == ConnStateData::FTP_ERROR) { + if (connState->ftp.state == ConnStateData::FTP_ERROR || + context->socketState() != STREAM_COMPLETE) { conn->close(); return; }