]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Fix some cbdataFree related memory leaks
authorAmos Jeffries <squid3@treenet.co.nz>
Wed, 4 Feb 2015 17:38:27 +0000 (09:38 -0800)
committerAmos Jeffries <squid3@treenet.co.nz>
Wed, 4 Feb 2015 17:38:27 +0000 (09:38 -0800)
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.

src/cbdata.h
src/neighbors.cc
src/stat.cc
src/store_swapout.cc

index 1bb7d06d896f0db72b9e7ce32793875ce26a02b3..cf4c4a48af022085b259dfd0ee3c2d04e708d8de 100644 (file)
@@ -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
index db443c967857cc4f5707cc066d302a08583537bd..69b4ed2a573b4fc2d02bbb45c2d7b323b435a829 100644 (file)
@@ -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
index b0ecd876ef12816bb0b1d75fcd9381f0e2333d53..0b57d16af550d6e4ebe2dc47d62dbd5d6aed9117 100644 (file)
@@ -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();
index 41b7db37f93b00487efb75f7543c56c5164f95fc..4bb54f7e4df011516e0751aea72f8a703f943851 100644 (file)
@@ -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<generic_cbdata *>(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<generic_cbdata *>(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) {