Message ID | 1291650325-10968-1-git-send-email-Jes.Sorensen@redhat.com |
---|---|
State | New |
Headers | show |
On 12/06/10 16:57, Kevin Wolf wrote: > bdrv_delete doesn't check for NULL, so this still isn't enough. Try > something like "qemu-img resize -f vmdx foo +0" and you'll get a segfault. Grrrr :( It's a bummer things are so inconsistent throughout QEMU, most of the free() functions can handle it. Updated patch in a minute - sorry. Thanks, Jes
Am 06.12.2010 16:45, schrieb Jes.Sorensen@redhat.com: > From: Jes Sorensen <Jes.Sorensen@redhat.com> > > Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com> > --- > qemu-img.c | 14 +++++++++----- > 1 files changed, 9 insertions(+), 5 deletions(-) > @@ -1432,7 +1434,7 @@ static int img_resize(int argc, char **argv) > int c, ret, relative; > const char *filename, *fmt, *size; > int64_t n, total_size; > - BlockDriverState *bs; > + BlockDriverState *bs = NULL; > QEMUOptionParameter *param; > QEMUOptionParameter resize_options[] = { > { > @@ -1483,14 +1485,16 @@ static int img_resize(int argc, char **argv) > param = parse_option_parameters("", resize_options, NULL); > if (set_option_parameter(param, BLOCK_OPT_SIZE, size)) { > /* Error message already printed when size parsing fails */ > - exit(1); > + ret = -1; > + goto out; > } > n = get_option_parameter(param, BLOCK_OPT_SIZE)->value.n; > free_option_parameters(param); > > bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR); > if (!bs) { > - return 1; > + ret = -1; > + goto out; > } > > if (relative) { bdrv_delete doesn't check for NULL, so this still isn't enough. Try something like "qemu-img resize -f vmdx foo +0" and you'll get a segfault. Kevin
diff --git a/qemu-img.c b/qemu-img.c index aded72d..2deac67 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -314,13 +314,15 @@ static int img_create(int argc, char **argv) drv = bdrv_find_format(fmt); if (!drv) { error("Unknown file format '%s'", fmt); - return 1; + ret = -1; + goto out; } proto_drv = bdrv_find_protocol(filename); if (!proto_drv) { error("Unknown protocol '%s'", filename); - return 1; + ret = -1; + goto out; } create_options = append_option_parameters(create_options, @@ -1432,7 +1434,7 @@ static int img_resize(int argc, char **argv) int c, ret, relative; const char *filename, *fmt, *size; int64_t n, total_size; - BlockDriverState *bs; + BlockDriverState *bs = NULL; QEMUOptionParameter *param; QEMUOptionParameter resize_options[] = { { @@ -1483,14 +1485,16 @@ static int img_resize(int argc, char **argv) param = parse_option_parameters("", resize_options, NULL); if (set_option_parameter(param, BLOCK_OPT_SIZE, size)) { /* Error message already printed when size parsing fails */ - exit(1); + ret = -1; + goto out; } n = get_option_parameter(param, BLOCK_OPT_SIZE)->value.n; free_option_parameters(param); bs = bdrv_new_open(filename, fmt, BDRV_O_FLAGS | BDRV_O_RDWR); if (!bs) { - return 1; + ret = -1; + goto out; } if (relative) {