From: Alex Rousskov Date: Thu, 15 Sep 2011 18:16:59 +0000 (-0600) Subject: Do not let cache manager requests kill SMP Squid using isOpen() assertion. X-Git-Tag: BumpSslServerFirst.take01~150 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f7c5a63628cbe8aac60adb8250f29623bbca232c;p=thirdparty%2Fsquid.git Do not let cache manager requests kill SMP Squid using isOpen() assertion. As the comment above the close call implies, we have not imported the foreign socket descriptor into our fd_table yet. We must use raw close(2), just like the corresponding Mgr::Request::Request(msg) code that allocates request.conn, uses raw assignment to give that half-baked connection a descriptor. TODO: This direct manipulation of Connection::fd is ugly, and this half-baked connection will most likely cause more [hidden] problems down the road. For example, Mgr::Request destructor will assert in a similar way if the request object is destroyed before Action::respond() is called. --- diff --git a/src/mgr/Action.cc b/src/mgr/Action.cc index 5fa0e4ba79..44b88a4b3c 100644 --- a/src/mgr/Action.cc +++ b/src/mgr/Action.cc @@ -70,7 +70,8 @@ Mgr::Action::respond(const Request& request) // Assume most kid classes are fully aggregatable (i.e., they do not dump // local info at all). Do not import the remote HTTP fd into our Comm // space; collect and send an IPC msg with collected info to Coordinator. - request.conn->close(); + ::close(request.conn->fd); + request.conn->fd = -1; collect(); sendResponse(request.requestId); }