Commit 0549ea8b authored by Max Reitz's avatar Max Reitz Committed by Kevin Wolf
Browse files

block/vdi: Error out immediately in vdi_create()



Currently, if an error occurs during the part of vdi_create() which
actually writes the image, the function stores -errno, but continues
anyway.

Instead of trying to write data which (if it can be written at all) does
not make any sense without the operations before succeeding (e.g.,
writing the image header), just error out immediately.

Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
Reviewed-by: default avatarStefan Weil <sw@weilnetz.de>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent e1b42f45
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -756,6 +756,7 @@ static int vdi_create(const char *filename, QEMUOptionParameter *options,
    vdi_header_to_le(&header);
    if (write(fd, &header, sizeof(header)) < 0) {
        result = -errno;
        goto close_and_exit;
    }

    if (bmap_size > 0) {
@@ -769,6 +770,8 @@ static int vdi_create(const char *filename, QEMUOptionParameter *options,
        }
        if (write(fd, bmap, bmap_size) < 0) {
            result = -errno;
            g_free(bmap);
            goto close_and_exit;
        }
        g_free(bmap);
    }
@@ -776,10 +779,12 @@ static int vdi_create(const char *filename, QEMUOptionParameter *options,
    if (image_type == VDI_TYPE_STATIC) {
        if (ftruncate(fd, sizeof(header) + bmap_size + blocks * block_size)) {
            result = -errno;
            goto close_and_exit;
        }
    }

    if (close(fd) < 0) {
close_and_exit:
    if ((close(fd) < 0) && !result) {
        result = -errno;
    }