Commit 51d7c00c14550334ec140ce8f40e04ed4c88de57
1 parent
a80bf99f
block: Polish error handling of brdv_open2 (Jan Kiszka)
Make sure that we always delete temporary disk images on error, remove obsolete malloc error checks and return proper error codes. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6702 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
21 additions
and
25 deletions
block.c
| ... | ... | @@ -311,8 +311,6 @@ int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags) |
| 311 | 311 | int ret; |
| 312 | 312 | |
| 313 | 313 | bs = bdrv_new(""); |
| 314 | - if (!bs) | |
| 315 | - return -ENOMEM; | |
| 316 | 314 | ret = bdrv_open2(bs, filename, flags | BDRV_O_FILE, NULL); |
| 317 | 315 | if (ret < 0) { |
| 318 | 316 | bdrv_delete(bs); |
| ... | ... | @@ -349,12 +347,10 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, |
| 349 | 347 | |
| 350 | 348 | /* if there is a backing file, use it */ |
| 351 | 349 | bs1 = bdrv_new(""); |
| 352 | - if (!bs1) { | |
| 353 | - return -ENOMEM; | |
| 354 | - } | |
| 355 | - if (bdrv_open(bs1, filename, 0) < 0) { | |
| 350 | + ret = bdrv_open(bs1, filename, 0); | |
| 351 | + if (ret < 0) { | |
| 356 | 352 | bdrv_delete(bs1); |
| 357 | - return -1; | |
| 353 | + return ret; | |
| 358 | 354 | } |
| 359 | 355 | total_size = bdrv_getlength(bs1) >> SECTOR_BITS; |
| 360 | 356 | |
| ... | ... | @@ -372,9 +368,10 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, |
| 372 | 368 | else |
| 373 | 369 | realpath(filename, backing_filename); |
| 374 | 370 | |
| 375 | - if (bdrv_create(&bdrv_qcow2, tmp_filename, | |
| 376 | - total_size, backing_filename, 0) < 0) { | |
| 377 | - return -1; | |
| 371 | + ret = bdrv_create(&bdrv_qcow2, tmp_filename, | |
| 372 | + total_size, backing_filename, 0); | |
| 373 | + if (ret < 0) { | |
| 374 | + return ret; | |
| 378 | 375 | } |
| 379 | 376 | filename = tmp_filename; |
| 380 | 377 | bs->is_temporary = 1; |
| ... | ... | @@ -383,14 +380,12 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, |
| 383 | 380 | pstrcpy(bs->filename, sizeof(bs->filename), filename); |
| 384 | 381 | if (flags & BDRV_O_FILE) { |
| 385 | 382 | drv = find_protocol(filename); |
| 386 | - if (!drv) | |
| 387 | - return -ENOENT; | |
| 388 | - } else { | |
| 389 | - if (!drv) { | |
| 390 | - drv = find_image_format(filename); | |
| 391 | - if (!drv) | |
| 392 | - return -1; | |
| 393 | - } | |
| 383 | + } else if (!drv) { | |
| 384 | + drv = find_image_format(filename); | |
| 385 | + } | |
| 386 | + if (!drv) { | |
| 387 | + ret = -ENOENT; | |
| 388 | + goto unlink_and_fail; | |
| 394 | 389 | } |
| 395 | 390 | bs->drv = drv; |
| 396 | 391 | bs->opaque = qemu_mallocz(drv->instance_size); |
| ... | ... | @@ -409,6 +404,9 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, |
| 409 | 404 | qemu_free(bs->opaque); |
| 410 | 405 | bs->opaque = NULL; |
| 411 | 406 | bs->drv = NULL; |
| 407 | + unlink_and_fail: | |
| 408 | + if (bs->is_temporary) | |
| 409 | + unlink(filename); | |
| 412 | 410 | return ret; |
| 413 | 411 | } |
| 414 | 412 | if (drv->bdrv_getlength) { |
| ... | ... | @@ -422,15 +420,13 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, |
| 422 | 420 | if (bs->backing_file[0] != '\0') { |
| 423 | 421 | /* if there is a backing file, use it */ |
| 424 | 422 | bs->backing_hd = bdrv_new(""); |
| 425 | - if (!bs->backing_hd) { | |
| 426 | - fail: | |
| 427 | - bdrv_close(bs); | |
| 428 | - return -ENOMEM; | |
| 429 | - } | |
| 430 | 423 | path_combine(backing_filename, sizeof(backing_filename), |
| 431 | 424 | filename, bs->backing_file); |
| 432 | - if (bdrv_open(bs->backing_hd, backing_filename, open_flags) < 0) | |
| 433 | - goto fail; | |
| 425 | + ret = bdrv_open(bs->backing_hd, backing_filename, open_flags); | |
| 426 | + if (ret < 0) { | |
| 427 | + bdrv_close(bs); | |
| 428 | + return ret; | |
| 429 | + } | |
| 434 | 430 | } |
| 435 | 431 | |
| 436 | 432 | /* call the change callback */ | ... | ... |