]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/memstore: fix a mem leak in MemStore::Collection::create_object() 12201/head
authorKefu Chai <kchai@redhat.com>
Mon, 28 Nov 2016 14:47:19 +0000 (22:47 +0800)
committerKefu Chai <kchai@redhat.com>
Mon, 28 Nov 2016 16:12:07 +0000 (00:12 +0800)
Signed-off-by: Kefu Chai <kchai@redhat.com>
src/os/memstore/MemStore.cc
src/os/memstore/MemStore.h

index 20a429d7f983ec058f20e6e9b497359f564887ad..c5f57eb327d7686e3683e5bdde104d745a9d74c8 100644 (file)
@@ -683,10 +683,11 @@ int MemStore::queue_transactions(Sequencer *osr,
 
   std::unique_lock<std::mutex> lock;
   if (osr) {
-    auto seq = reinterpret_cast<OpSequencer**>(&osr->p);
-    if (*seq == nullptr)
-      *seq = new OpSequencer;
-    lock = std::unique_lock<std::mutex>((*seq)->mutex);
+    if (!osr->p) {
+      osr->p = new OpSequencer();
+    }
+    auto seq = static_cast<OpSequencer*>(osr->p.get());
+    lock = std::unique_lock<std::mutex>(seq->mutex);
   }
 
   for (vector<Transaction>::iterator p = tls.begin(); p != tls.end(); ++p) {
index 3f1fb0b7c23a9c73ba7eca9ca5c8e3c1f0c3a2bc..d11ea3548651226e9225bb0bf3a3ea3f3940038b 100644 (file)
@@ -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;