From: Francesco Chemolli Date: Tue, 6 Jan 2015 21:05:37 +0000 (+0100) Subject: Fix splay-related issues X-Git-Tag: merge-candidate-3-v1~369 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5bc2be306e6560620ba2294b48d23a5f688be739;p=thirdparty%2Fsquid.git Fix splay-related issues In several cases Splay data membes would not be properly initialized in ACL and MemPools code A duplicate IP ACL value would cause an assert. --- diff --git a/include/splay.h b/include/splay.h index 2119e501ee..acf42709ea 100644 --- a/include/splay.h +++ b/include/splay.h @@ -299,7 +299,7 @@ template void Splay::insert(Value const &value, SPLAYCMP *compare) { - assert (!find (value, compare)); + assert (find (value, compare) == NULL); if (head == NULL) head = new SplayNode(value); else diff --git a/src/acl/Arp.cc b/src/acl/Arp.cc index 5eae6100b4..08b3c09256 100644 --- a/src/acl/Arp.cc +++ b/src/acl/Arp.cc @@ -114,6 +114,8 @@ aclParseArpData(const char *t) void ACLARP::parse() { + if (!data) + data = new Splay(); aclParseArpList(&data); } diff --git a/src/acl/Eui64.cc b/src/acl/Eui64.cc index d18e73a4fe..14b08d2d88 100644 --- a/src/acl/Eui64.cc +++ b/src/acl/Eui64.cc @@ -88,6 +88,8 @@ aclParseEuiData(const char *t) void ACLEui64::parse() { + if (!data) + data = new Splay(); aclParseEuiList(&data); } diff --git a/src/acl/HttpStatus.cc b/src/acl/HttpStatus.cc index d83d7de4dc..a62c6e4ee2 100644 --- a/src/acl/HttpStatus.cc +++ b/src/acl/HttpStatus.cc @@ -111,6 +111,9 @@ aclParseHTTPStatusData(const char *t) void ACLHTTPStatus::parse() { + if (!data) + data = new Splay(); + aclParseHTTPStatusList (&data); } diff --git a/src/acl/Ip.cc b/src/acl/Ip.cc index 7fc37a9b5b..0b8ad87951 100644 --- a/src/acl/Ip.cc +++ b/src/acl/Ip.cc @@ -485,7 +485,8 @@ ACLIP::parse() /* pop each result off the list and add it to the data tree individually */ acl_ip_data *next_node = q->next; q->next = NULL; - data->insert(q, acl_ip_data::NetworkCompare); + if (!data->find(q,acl_ip_data::NetworkCompare)) + data->insert(q, acl_ip_data::NetworkCompare); q = next_node; } } diff --git a/src/acl/StringData.cc b/src/acl/StringData.cc index 7775b7cfd9..f5cac0be7b 100644 --- a/src/acl/StringData.cc +++ b/src/acl/StringData.cc @@ -83,8 +83,10 @@ ACLStringData::dump() const void ACLStringData::parse() { - char *t; + if (!values) + values = new Splay(); + char *t; while ((t = strtokFile())) values->insert(xstrdup(t), splaystrcmp); } diff --git a/src/acl/UserData.cc b/src/acl/UserData.cc index 28af6dc36d..8a59acfe28 100644 --- a/src/acl/UserData.cc +++ b/src/acl/UserData.cc @@ -102,8 +102,11 @@ void ACLUserData::parse() { debugs(28, 2, "aclParseUserList: parsing user list"); - char *t = NULL; + if (!names) + names = new Splay(); + + char *t = NULL; if ((t = ConfigParser::strtokFile())) { debugs(28, 5, "aclParseUserList: First token is " << t); diff --git a/src/mem/PoolChunked.cc b/src/mem/PoolChunked.cc index 6ed4017dce..abbd17ddd0 100644 --- a/src/mem/PoolChunked.cc +++ b/src/mem/PoolChunked.cc @@ -135,16 +135,11 @@ MemChunk::MemChunk(MemPoolChunked *aPool) pool->allChunks.insert(this, memCompChunks); } -MemPoolChunked::MemPoolChunked(const char *aLabel, size_t aSize) : MemImplementingAllocator(aLabel, aSize) +MemPoolChunked::MemPoolChunked(const char *aLabel, size_t aSize) : + MemImplementingAllocator(aLabel, aSize) , chunk_size(0), + chunk_capacity(0), chunkCount(0), freeCache(0), nextFreeChunk(0), + Chunks(0), allChunks(Splay()) { - chunk_size = 0; - chunk_capacity = 0; - chunkCount = 0; - freeCache = 0; - nextFreeChunk = 0; - Chunks = 0; - next = 0; - setChunkSize(MEM_CHUNK_SIZE); #if HAVE_MALLOPT && M_MMAP_MAX