]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: fix rbd_open_by_id, rbd_open_by_id_read_only 32837/head
authoryangjun <yangjun@cmss.chinamobile.com>
Sun, 8 Dec 2019 01:09:53 +0000 (09:09 +0800)
committerNathan Cutler <ncutler@suse.com>
Fri, 24 Jan 2020 16:08:53 +0000 (17:08 +0100)
These methods incorrectly delete ImageCtx on error, resulting
in double-free heap corruption.

Fixes: https://tracker.ceph.com/issues/43178
Signed-off-by: yangjun <yangjun@cmss.chinamobile.com>
(cherry picked from commit 3457192c24a66ba499a7c9b1747bc29c79b34636)

src/librbd/librbd.cc

index 5249c545a3ad454553fed3f5600369fe30223561..749f5cb5edddfdbda73f0a94bd4b3a966cb9c560 100644 (file)
@@ -3973,9 +3973,7 @@ extern "C" int rbd_open_by_id(rados_ioctx_t p, const char *id,
              ictx->id.c_str(), ictx->snap_name.c_str(), ictx->read_only);
 
   int r = ictx->state->open(0);
-  if (r < 0) {
-    delete ictx;
-  } else {
+  if (r >= 0) {
     *image = (rbd_image_t)ictx;
   }
   tracepoint(librbd, open_image_exit, r);
@@ -4048,9 +4046,7 @@ extern "C" int rbd_open_by_id_read_only(rados_ioctx_t p, const char *id,
              ictx->id.c_str(), ictx->snap_name.c_str(), ictx->read_only);
 
   int r = ictx->state->open(0);
-  if (r < 0) {
-    delete ictx;
-  } else {
+  if (r >= 0) {
     *image = (rbd_image_t)ictx;
   }
   tracepoint(librbd, open_image_exit, r);