From 7c6d3cd7b6eb17fa23c37b6deac502499a01d6c8 Mon Sep 17 00:00:00 2001 From: Amos Jeffries Date: Sat, 18 Jun 2016 23:48:03 +1200 Subject: [PATCH] Bug 3579: assertion failed 'MemPools[type]' from dst_as ACL --- src/PeerSelectState.h | 6 ++++++ src/enums.h | 1 - src/peer_select.cc | 13 +++++-------- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/PeerSelectState.h b/src/PeerSelectState.h index 57404bad97..cc22e6dab3 100644 --- a/src/PeerSelectState.h +++ b/src/PeerSelectState.h @@ -38,11 +38,17 @@ void peerSelectInit(void); class FwdServer { public: + MEMPROXY_CLASS(FwdServer); + FwdServer(CachePeer *p, hier_code c) : _peer(cbdataReference(p)), code(c), next(NULL) {} + ~FwdServer() {cbdataReferenceDone(_peer);} + CachePeer *_peer; /* NULL --> origin server */ hier_code code; FwdServer *next; }; +MEMPROXY_CLASS_INLINE(FwdServer); + class ps_state { diff --git a/src/enums.h b/src/enums.h index 5caee2b595..4d04805e6d 100644 --- a/src/enums.h +++ b/src/enums.h @@ -170,7 +170,6 @@ typedef enum { MEM_DONTFREE, // following pools are initialized late by their component if needed (or never) MEM_FQDNCACHE_ENTRY, - MEM_FWD_SERVER, MEM_IDNS_QUERY, MEM_IPCACHE_ENTRY, MEM_MAX diff --git a/src/peer_select.cc b/src/peer_select.cc index 79c5a4f13f..251a679b22 100644 --- a/src/peer_select.cc +++ b/src/peer_select.cc @@ -71,7 +71,7 @@ ps_state::~ps_state() while (servers) { FwdServer *next = servers->next; cbdataReferenceDone(servers->_peer); - memFree(servers, MEM_FWD_SERVER); + delete servers; servers = next; } @@ -246,7 +246,7 @@ peerSelectDnsPaths(ps_state *psstate) // clear the used fs and continue psstate->servers = fs->next; cbdataReferenceDone(fs->_peer); - memFree(fs, MEM_FWD_SERVER); + delete fs; peerSelectDnsPaths(psstate); return; } @@ -268,7 +268,7 @@ peerSelectDnsPaths(ps_state *psstate) while (fs) { psstate->servers = fs->next; cbdataReferenceDone(fs->_peer); - memFree(fs, MEM_FWD_SERVER); + delete fs; fs = psstate->servers; } } @@ -377,7 +377,7 @@ peerSelectDnsResults(const ipcache_addrs *ia, const DnsLookupDetails &details, v psstate->servers = fs->next; cbdataReferenceDone(fs->_peer); - memFree(fs, MEM_FWD_SERVER); + delete fs; // see if more paths can be found peerSelectDnsPaths(psstate); @@ -772,7 +772,6 @@ void peerSelectInit(void) { memset(&PeerStats, '\0', sizeof(PeerStats)); - memDataInit(MEM_FWD_SERVER, "FwdServer", sizeof(FwdServer), 0); } static void @@ -934,12 +933,10 @@ peerHandlePingReply(CachePeer * p, peer_t type, AnyP::ProtocolType proto, void * static void peerAddFwdServer(FwdServer ** FSVR, CachePeer * p, hier_code code) { - FwdServer *fs = (FwdServer *)memAllocate(MEM_FWD_SERVER); debugs(44, 5, "peerAddFwdServer: adding " << (p ? p->host : "DIRECT") << " " << hier_code_str[code] ); - fs->_peer = cbdataReference(p); - fs->code = code; + FwdServer *fs = new FwdServer(p, code); while (*FSVR) FSVR = &(*FSVR)->next; -- 2.47.2