]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: fix leak of pool op reply data
authorSage Weil <sage@inktank.com>
Sun, 9 Dec 2012 05:44:54 +0000 (21:44 -0800)
committerSage Weil <sage@inktank.com>
Sun, 9 Dec 2012 05:44:54 +0000 (21:44 -0800)
We pass a pointer because it is an optional argument, but we shouldn't
put the bufferlist on the heap or else we have to manage it's life
cycle, and that's fragile (and previously broken).

Signed-off-by: Sage Weil <sage@inktank.com>
src/mon/OSDMonitor.cc
src/mon/OSDMonitor.h

index c845c2b600cbd69e40add5426e413e195fce2ad1..3186c4d6bc36fe06c624243f8fdc913634b20513 100644 (file)
@@ -2979,7 +2979,6 @@ bool OSDMonitor::prepare_pool_op(MPoolOp *m)
     return prepare_pool_op_auid(m);
   }
 
-  bufferlist *blp = NULL;
   int ret = 0;
   bool changed = false;
 
@@ -2990,6 +2989,8 @@ bool OSDMonitor::prepare_pool_op(MPoolOp *m)
   else
     pp = *osdmap.get_pg_pool(m->pool);
 
+  bufferlist reply_data;
+
   // pool snaps vs unmanaged snaps are mutually exclusive
   switch (m->op) {
   case POOL_OP_CREATE_SNAP:
@@ -3029,10 +3030,9 @@ bool OSDMonitor::prepare_pool_op(MPoolOp *m)
 
   case POOL_OP_CREATE_UNMANAGED_SNAP: 
     {
-      blp = new bufferlist();
       uint64_t snapid;
       pp.add_unmanaged_snap(snapid);
-      ::encode(snapid, *blp);
+      ::encode(snapid, reply_data);
       changed = true;
     }
     break;
@@ -3055,7 +3055,7 @@ bool OSDMonitor::prepare_pool_op(MPoolOp *m)
   }
 
  out:
-  paxos->wait_for_commit(new OSDMonitor::C_PoolOp(this, m, ret, pending_inc.epoch, blp));
+  paxos->wait_for_commit(new OSDMonitor::C_PoolOp(this, m, ret, pending_inc.epoch, &reply_data));
   propose_pending();
   return false;
 }
index a82f5f0faf44634432f0c9a46640808ad39c0c4b..4faa90e2902141c39fa4eec1f4c62303e3193b4d 100644 (file)
@@ -240,16 +240,19 @@ private:
     MPoolOp *m;
     int replyCode;
     int epoch;
-    bufferlist *reply_data;
-    C_PoolOp(OSDMonitor * osd, MPoolOp *m_, int rc, int e, bufferlist *rd=NULL) : 
-      osdmon(osd), m(m_), replyCode(rc), epoch(e), reply_data(rd) {}
+    bufferlist reply_data;
+    C_PoolOp(OSDMonitor * osd, MPoolOp *m_, int rc, int e, bufferlist *rd=NULL) :
+      osdmon(osd), m(m_), replyCode(rc), epoch(e) {
+      if (rd)
+       reply_data = *rd;
+    }
     void finish(int r) {
       if (r == -ECANCELED) {
        if (m)
          m->put();
        return;
       }
-      osdmon->_pool_op_reply(m, replyCode, epoch, reply_data);
+      osdmon->_pool_op_reply(m, replyCode, epoch, &reply_data);
     }
   };