Am 29.04.2014 19:03, schrieb Max Reitz: > 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: Max Reitz <[email protected]> > --- > block/vdi.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/block/vdi.c b/block/vdi.c > index 81faa25..27737af 100644 > --- a/block/vdi.c > +++ b/block/vdi.c > @@ -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) {
I prefer (result == 0) here. > result = -errno; > } > > Reviewed-by: Stefan Weil <[email protected]>
