[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 18/35] rbd: fix leak in qemu_rbd_open failure paths
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PATCH 18/35] rbd: fix leak in qemu_rbd_open failure paths |
Date: |
Mon, 12 Sep 2011 16:19:17 +0200 |
From: Sage Weil <address@hidden>
Fix leak of s->snap in failure path. Simplify error paths for the whole
function.
Reported-by: Stefan Hajnoczi <address@hidden>
Signed-off-by: Sage Weil <address@hidden>
Reviewed-by: Stefan Hajnoczi <address@hidden>
Signed-off-by: Kevin Wolf <address@hidden>
---
block/rbd.c | 28 +++++++++++++---------------
1 files changed, 13 insertions(+), 15 deletions(-)
diff --git a/block/rbd.c b/block/rbd.c
index 2763092..1b78d51 100644
--- a/block/rbd.c
+++ b/block/rbd.c
@@ -427,10 +427,6 @@ static int qemu_rbd_open(BlockDriverState *bs, const char
*filename, int flags)
conf, sizeof(conf)) < 0) {
return -EINVAL;
}
- s->snap = NULL;
- if (snap_buf[0] != '\0') {
- s->snap = g_strdup(snap_buf);
- }
clientname = qemu_rbd_parse_clientname(conf, clientname_buf);
r = rados_create(&s->cluster, clientname);
@@ -439,12 +435,16 @@ static int qemu_rbd_open(BlockDriverState *bs, const char
*filename, int flags)
return r;
}
+ s->snap = NULL;
+ if (snap_buf[0] != '\0') {
+ s->snap = g_strdup(snap_buf);
+ }
+
if (strstr(conf, "conf=") == NULL) {
r = rados_conf_read_file(s->cluster, NULL);
if (r < 0) {
error_report("error reading config file");
- rados_shutdown(s->cluster);
- return r;
+ goto failed_shutdown;
}
}
@@ -452,31 +452,26 @@ static int qemu_rbd_open(BlockDriverState *bs, const char
*filename, int flags)
r = qemu_rbd_set_conf(s->cluster, conf);
if (r < 0) {
error_report("error setting config options");
- rados_shutdown(s->cluster);
- return r;
+ goto failed_shutdown;
}
}
r = rados_connect(s->cluster);
if (r < 0) {
error_report("error connecting");
- rados_shutdown(s->cluster);
- return r;
+ goto failed_shutdown;
}
r = rados_ioctx_create(s->cluster, pool, &s->io_ctx);
if (r < 0) {
error_report("error opening pool %s", pool);
- rados_shutdown(s->cluster);
- return r;
+ goto failed_shutdown;
}
r = rbd_open(s->io_ctx, s->name, &s->image, s->snap);
if (r < 0) {
error_report("error reading header from %s", s->name);
- rados_ioctx_destroy(s->io_ctx);
- rados_shutdown(s->cluster);
- return r;
+ goto failed_open;
}
bs->read_only = (s->snap != NULL);
@@ -497,8 +492,11 @@ static int qemu_rbd_open(BlockDriverState *bs, const char
*filename, int flags)
failed:
rbd_close(s->image);
+failed_open:
rados_ioctx_destroy(s->io_ctx);
+failed_shutdown:
rados_shutdown(s->cluster);
+ g_free(s->snap);
return r;
}
--
1.7.6
- [Qemu-devel] [PATCH 35/35] qcow2: fix range check, (continued)
- [Qemu-devel] [PATCH 35/35] qcow2: fix range check, Kevin Wolf, 2011/09/12
- [Qemu-devel] [PATCH 34/35] qcow2: align cluster_data to block to improve performance using O_DIRECT, Kevin Wolf, 2011/09/12
- [Qemu-devel] [PATCH 19/35] ide/atapi: Don't fail eject when tray is already open, Kevin Wolf, 2011/09/12
- [Qemu-devel] [PATCH 25/35] block: Move BlockConf & friends from block_int.h to block.h, Kevin Wolf, 2011/09/12
- [Qemu-devel] [PATCH 26/35] hw: Trim superfluous #include "block_int.h", Kevin Wolf, 2011/09/12
- [Qemu-devel] [PATCH 30/35] block: New change_media_cb() parameter load, Kevin Wolf, 2011/09/12
- [Qemu-devel] [PATCH 32/35] qcow2: initialize metadata before inserting in cluster_allocs, Kevin Wolf, 2011/09/12
- [Qemu-devel] [PATCH 23/35] block: Drop BlockDriverState member removable, Kevin Wolf, 2011/09/12
- [Qemu-devel] [PATCH 33/35] ahci: Remove unused struct member, Kevin Wolf, 2011/09/12
- [Qemu-devel] [PATCH 17/35] rbd: clean up, fix style, Kevin Wolf, 2011/09/12
- [Qemu-devel] [PATCH 18/35] rbd: fix leak in qemu_rbd_open failure paths,
Kevin Wolf <=
- [Qemu-devel] [PATCH 29/35] nbd: Clean up use of block_int.h, Kevin Wolf, 2011/09/12
- [Qemu-devel] [PATCH 27/35] block: New bdrv_set_buffer_alignment(), Kevin Wolf, 2011/09/12
- Re: [Qemu-devel] [PULL 00/35] Block patches, Anthony Liguori, 2011/09/15