From 0e3f3e0d457ea18aa032ae3c41de5d162b6e36f3 Mon Sep 17 00:00:00 2001 From: robertc <> Date: Tue, 20 May 2003 05:16:48 +0000 Subject: [PATCH] Summary: Fix race on aborted requests. Keywords: There was a race where a client request that has no data recieved, but has a store entry could trigger an assert on client socket closure. --- src/MemObject.h | 7 ++++++- src/store_client.cc | 13 +++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/MemObject.h b/src/MemObject.h index 6ea0038e3f..c7ab3a01ec 100644 --- a/src/MemObject.h +++ b/src/MemObject.h @@ -1,6 +1,6 @@ /* - * $Id: MemObject.h,v 1.4 2003/03/04 01:40:25 robertc Exp $ + * $Id: MemObject.h,v 1.5 2003/05/19 23:16:48 robertc Exp $ * * * SQUID Web Proxy Cache http://www.squid-cache.org/ @@ -93,6 +93,11 @@ public: mem_hdr data_hdr; off_t inmem_lo; dlink_list clients; + /* TODO: move into .cc or .cci */ + size_t clientCount() const {return nclients;} + + bool clientIsFirst(void *sc) const {return (clients.head && sc == clients.head->data);} + int nclients; struct diff --git a/src/store_client.cc b/src/store_client.cc index 180c7763ee..c7ae00562b 100644 --- a/src/store_client.cc +++ b/src/store_client.cc @@ -1,6 +1,6 @@ /* - * $Id: store_client.cc,v 1.126 2003/03/11 08:24:43 robertc Exp $ + * $Id: store_client.cc,v 1.127 2003/05/19 23:16:48 robertc Exp $ * * DEBUG: section 90 Storage Manager Client-Side Interface * AUTHOR: Duane Wessels @@ -611,12 +611,12 @@ storeUnregister(store_client * sc, StoreEntry * e, void *data) return 0; } - if (mem->clients.head == NULL) { + if (mem->clientCount() == 0) { debug(90, 3) ("storeUnregister: Consistency failure - store client being unregistered is not in the mem object's list for '%s'\n", e->getMD5Text()); return 0; } - if (sc == mem->clients.head->data) { + if (mem->clientIsFirst(sc)) { /* * If we are unregistering the _first_ client for this * entry, then we have to reset the client FD to -1. @@ -727,8 +727,13 @@ CheckQuickAbort2(StoreEntry * entry) } expectlen = entry->getReply()->content_length + entry->getReply()->hdr_sz; - assert (entry->getReply()->content_length + entry->getReply()->hdr_sz >= 0); + + if (expectlen < 0) + /* expectlen is < 0 if *no* information about the object has been recieved */ + return 1; + curlen = (size_t) mem->endOffset (); + minlen = (size_t) Config.quickAbort.min << 10; if (minlen < 0) { -- 2.47.3