From: Amos Jeffries Date: Wed, 4 Feb 2015 17:38:27 +0000 (-0800) Subject: Fix some cbdataFree related memory leaks X-Git-Tag: merge-candidate-3-v1~289 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bd6e2f166dbc9cf92f1e45ba27ecae0afdd8f0ba;p=thirdparty%2Fsquid.git Fix some cbdataFree related memory leaks The delete operator should have been called for these objects after previous code changes converted them to CBDATA_CLASS. As a result any member objects relying on their destructor to cleanup were being leaked. Also, make generic_cbdata::data a private member. The unwrap() method is easily used now. --- diff --git a/src/cbdata.h b/src/cbdata.h index 1bb7d06d89..cf4c4a48af 100644 --- a/src/cbdata.h +++ b/src/cbdata.h @@ -343,6 +343,7 @@ public: delete this; } +private: /** * The wrapped data - only public to allow the mild abuse of this facility * done by store_swapout - it gives a wrapped StoreEntry to StoreIO as the diff --git a/src/neighbors.cc b/src/neighbors.cc index db443c9678..69b4ed2a57 100644 --- a/src/neighbors.cc +++ b/src/neighbors.cc @@ -1423,8 +1423,7 @@ peerCountMcastPeersDone(void *data) fake->abort(); // sets ENTRY_ABORTED and initiates releated cleanup HTTPMSGUNLOCK(fake->mem_obj->request); fake->unlock("peerCountMcastPeersDone"); - HTTPMSGUNLOCK(psstate->request); - cbdataFree(psstate); + delete psstate; } static void diff --git a/src/stat.cc b/src/stat.cc index b0ecd876ef..0b57d16af5 100644 --- a/src/stat.cc +++ b/src/stat.cc @@ -371,11 +371,11 @@ statObjects(void *data) storeAppendPrintf(state->sentry, "} by kid%d\n\n", KidIdentifier); state->sentry->complete(); state->sentry->unlock("statObjects+isDone"); - cbdataFree(state); + delete state; return; } else if (EBIT_TEST(state->sentry->flags, ENTRY_ABORTED)) { state->sentry->unlock("statObjects+aborted"); - cbdataFree(state); + delete state; return; } else if (state->sentry->checkDeferRead(-1)) { state->sentry->flush(); diff --git a/src/store_swapout.cc b/src/store_swapout.cc index 41b7db37f9..4bb54f7e4d 100644 --- a/src/store_swapout.cc +++ b/src/store_swapout.cc @@ -89,8 +89,9 @@ storeSwapOutStart(StoreEntry * e) static void storeSwapOutFileNotify(void *data, int errflag, StoreIOState::Pointer self) { - generic_cbdata *c = (generic_cbdata *)data; - StoreEntry *e = (StoreEntry *)c->data; + StoreEntry *e; + static_cast(data)->unwrap(&e); + MemObject *mem = e->mem_obj; assert(e->swap_status == SWAPOUT_WRITING); assert(mem); @@ -281,12 +282,12 @@ StoreEntry::swapOutFileClose(int how) static void storeSwapOutFileClosed(void *data, int errflag, StoreIOState::Pointer self) { - generic_cbdata *c = (generic_cbdata *)data; - StoreEntry *e = (StoreEntry *)c->data; + StoreEntry *e; + static_cast(data)->unwrap(&e); + MemObject *mem = e->mem_obj; assert(mem->swapout.sio == self); assert(e->swap_status == SWAPOUT_WRITING); - cbdataFree(c); // if object_size is still unknown, the entry was probably aborted if (errflag || e->objectLen() < 0) {