From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LfMYW-00088t-W3 for qemu-devel@nongnu.org; Thu, 05 Mar 2009 18:00:45 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LfMYV-00087o-V1 for qemu-devel@nongnu.org; Thu, 05 Mar 2009 18:00:44 -0500 Received: from [199.232.76.173] (port=43401 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LfMYV-00087c-Qw for qemu-devel@nongnu.org; Thu, 05 Mar 2009 18:00:43 -0500 Received: from savannah.gnu.org ([199.232.41.3]:59789 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 1LfMYT-0005Y4-Gq for qemu-devel@nongnu.org; Thu, 05 Mar 2009 18:00:41 -0500 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1LfMYR-0000Yi-Px for qemu-devel@nongnu.org; Thu, 05 Mar 2009 23:00:40 +0000 Received: from aliguori by cvs.savannah.gnu.org with local (Exim 4.69) (envelope-from ) id 1LfMYQ-0000XM-Cy for qemu-devel@nongnu.org; Thu, 05 Mar 2009 23:00:39 +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 23:00:38 +0000 Subject: [Qemu-devel] [6702] 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: 6702 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6702 Author: aliguori Date: 2009-03-05 23:00:29 +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: -------------- trunk/block.c Modified: trunk/block.c =================================================================== --- trunk/block.c 2009-03-05 23:00:02 UTC (rev 6701) +++ trunk/block.c 2009-03-05 23:00:29 UTC (rev 6702) @@ -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 */