From: Kefu Chai Date: Mon, 28 Nov 2016 14:47:19 +0000 (+0800) Subject: os/memstore: fix a mem leak in MemStore::Collection::create_object() X-Git-Tag: v11.1.0~141^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F12201%2Fhead;p=ceph.git os/memstore: fix a mem leak in MemStore::Collection::create_object() Signed-off-by: Kefu Chai --- diff --git a/src/os/memstore/MemStore.cc b/src/os/memstore/MemStore.cc index 20a429d7f98..c5f57eb327d 100644 --- a/src/os/memstore/MemStore.cc +++ b/src/os/memstore/MemStore.cc @@ -683,10 +683,11 @@ int MemStore::queue_transactions(Sequencer *osr, std::unique_lock lock; if (osr) { - auto seq = reinterpret_cast(&osr->p); - if (*seq == nullptr) - *seq = new OpSequencer; - lock = std::unique_lock((*seq)->mutex); + if (!osr->p) { + osr->p = new OpSequencer(); + } + auto seq = static_cast(osr->p.get()); + lock = std::unique_lock(seq->mutex); } for (vector::iterator p = tls.begin(); p != tls.end(); ++p) { diff --git a/src/os/memstore/MemStore.h b/src/os/memstore/MemStore.h index 3f1fb0b7c23..d11ea354865 100644 --- a/src/os/memstore/MemStore.h +++ b/src/os/memstore/MemStore.h @@ -45,6 +45,7 @@ public: friend void intrusive_ptr_add_ref(Object *o) { o->get(); } friend void intrusive_ptr_release(Object *o) { o->put(); } + Object() : RefCountedObject(nullptr, 0) {} // interface for object data virtual size_t get_size() const = 0; virtual int read(uint64_t offset, uint64_t len, bufferlist &bl) = 0;