From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LfJSQ-0002KA-Ps for qemu-devel@nongnu.org; Thu, 05 Mar 2009 14:42:14 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LfJSP-0002JT-EK for qemu-devel@nongnu.org; Thu, 05 Mar 2009 14:42:14 -0500 Received: from [199.232.76.173] (port=48540 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LfJSP-0002JI-8c for qemu-devel@nongnu.org; Thu, 05 Mar 2009 14:42:13 -0500 Received: from savannah.gnu.org ([199.232.41.3]:38607 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LfJSO-0003kV-Rb for qemu-devel@nongnu.org; Thu, 05 Mar 2009 14:42:13 -0500 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1LfJSO-0002UL-3n for qemu-devel@nongnu.org; Thu, 05 Mar 2009 19:42:12 +0000 Received: from aliguori by cvs.savannah.gnu.org with local (Exim 4.69) (envelope-from ) id 1LfJSN-0002UH-VD for qemu-devel@nongnu.org; Thu, 05 Mar 2009 19:42:12 +0000 MIME-Version: 1.0 Errors-To: aliguori Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Anthony Liguori Message-Id: Date: Thu, 05 Mar 2009 19:42:11 +0000 Subject: [Qemu-devel] [6694] block: Polish error handling of brdv_open2 (Jan Kiszka) Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 6694 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6694 Author: aliguori Date: 2009-03-05 19:42:11 +0000 (Thu, 05 Mar 2009) Log Message: ----------- 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 Signed-off-by: Anthony Liguori Modified Paths: -------------- branches/stable_0_10_0/block.c Modified: branches/stable_0_10_0/block.c =================================================================== --- branches/stable_0_10_0/block.c 2009-03-05 19:42:07 UTC (rev 6693) +++ branches/stable_0_10_0/block.c 2009-03-05 19:42:11 UTC (rev 6694) @@ -311,8 +311,6 @@ int ret; bs = bdrv_new(""); - if (!bs) - return -ENOMEM; ret = bdrv_open2(bs, filename, flags | BDRV_O_FILE, NULL); if (ret < 0) { bdrv_delete(bs); @@ -349,12 +347,10 @@ /* if there is a backing file, use it */ bs1 = bdrv_new(""); - if (!bs1) { - return -ENOMEM; - } - if (bdrv_open(bs1, filename, 0) < 0) { + ret = bdrv_open(bs1, filename, 0); + if (ret < 0) { bdrv_delete(bs1); - return -1; + return ret; } total_size = bdrv_getlength(bs1) >> SECTOR_BITS; @@ -372,9 +368,10 @@ else realpath(filename, backing_filename); - if (bdrv_create(&bdrv_qcow2, tmp_filename, - total_size, backing_filename, 0) < 0) { - return -1; + ret = bdrv_create(&bdrv_qcow2, tmp_filename, + total_size, backing_filename, 0); + if (ret < 0) { + return ret; } filename = tmp_filename; bs->is_temporary = 1; @@ -383,15 +380,13 @@ pstrcpy(bs->filename, sizeof(bs->filename), filename); if (flags & BDRV_O_FILE) { drv = find_protocol(filename); - if (!drv) - return -ENOENT; - } else { - if (!drv) { - drv = find_image_format(filename); - if (!drv) - return -1; - } + } else if (!drv) { + drv = find_image_format(filename); } + if (!drv) { + ret = -ENOENT; + goto unlink_and_fail; + } bs->drv = drv; bs->opaque = qemu_mallocz(drv->instance_size); /* Note: for compatibility, we open disk image files as RDWR, and @@ -409,6 +404,9 @@ qemu_free(bs->opaque); bs->opaque = NULL; bs->drv = NULL; + unlink_and_fail: + if (bs->is_temporary) + unlink(filename); return ret; } if (drv->bdrv_getlength) { @@ -422,15 +420,13 @@ if (bs->backing_file[0] != '\0') { /* if there is a backing file, use it */ bs->backing_hd = bdrv_new(""); - if (!bs->backing_hd) { - fail: - bdrv_close(bs); - return -ENOMEM; - } path_combine(backing_filename, sizeof(backing_filename), filename, bs->backing_file); - if (bdrv_open(bs->backing_hd, backing_filename, open_flags) < 0) - goto fail; + ret = bdrv_open(bs->backing_hd, backing_filename, open_flags); + if (ret < 0) { + bdrv_close(bs); + return ret; + } } /* call the change callback */