mirror of https://github.com/xemu-project/xemu.git
cloop: Fix bdrv_open() error handling
Return -errno instead of -1 on errors. While touching the code, fix a memory leak. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
5b7d7dfd19
commit
1a60657f57
|
@ -57,27 +57,32 @@ static int cloop_open(BlockDriverState *bs, int flags)
|
||||||
{
|
{
|
||||||
BDRVCloopState *s = bs->opaque;
|
BDRVCloopState *s = bs->opaque;
|
||||||
uint32_t offsets_size, max_compressed_block_size = 1, i;
|
uint32_t offsets_size, max_compressed_block_size = 1, i;
|
||||||
|
int ret;
|
||||||
|
|
||||||
bs->read_only = 1;
|
bs->read_only = 1;
|
||||||
|
|
||||||
/* read header */
|
/* read header */
|
||||||
if (bdrv_pread(bs->file, 128, &s->block_size, 4) < 4) {
|
ret = bdrv_pread(bs->file, 128, &s->block_size, 4);
|
||||||
goto cloop_close;
|
if (ret < 0) {
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
s->block_size = be32_to_cpu(s->block_size);
|
s->block_size = be32_to_cpu(s->block_size);
|
||||||
|
|
||||||
if (bdrv_pread(bs->file, 128 + 4, &s->n_blocks, 4) < 4) {
|
ret = bdrv_pread(bs->file, 128 + 4, &s->n_blocks, 4);
|
||||||
goto cloop_close;
|
if (ret < 0) {
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
s->n_blocks = be32_to_cpu(s->n_blocks);
|
s->n_blocks = be32_to_cpu(s->n_blocks);
|
||||||
|
|
||||||
/* read offsets */
|
/* read offsets */
|
||||||
offsets_size = s->n_blocks * sizeof(uint64_t);
|
offsets_size = s->n_blocks * sizeof(uint64_t);
|
||||||
s->offsets = g_malloc(offsets_size);
|
s->offsets = g_malloc(offsets_size);
|
||||||
if (bdrv_pread(bs->file, 128 + 4 + 4, s->offsets, offsets_size) <
|
|
||||||
offsets_size) {
|
ret = bdrv_pread(bs->file, 128 + 4 + 4, s->offsets, offsets_size);
|
||||||
goto cloop_close;
|
if (ret < 0) {
|
||||||
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i=0;i<s->n_blocks;i++) {
|
for(i=0;i<s->n_blocks;i++) {
|
||||||
s->offsets[i] = be64_to_cpu(s->offsets[i]);
|
s->offsets[i] = be64_to_cpu(s->offsets[i]);
|
||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
|
@ -92,7 +97,8 @@ static int cloop_open(BlockDriverState *bs, int flags)
|
||||||
s->compressed_block = g_malloc(max_compressed_block_size + 1);
|
s->compressed_block = g_malloc(max_compressed_block_size + 1);
|
||||||
s->uncompressed_block = g_malloc(s->block_size);
|
s->uncompressed_block = g_malloc(s->block_size);
|
||||||
if (inflateInit(&s->zstream) != Z_OK) {
|
if (inflateInit(&s->zstream) != Z_OK) {
|
||||||
goto cloop_close;
|
ret = -EINVAL;
|
||||||
|
goto fail;
|
||||||
}
|
}
|
||||||
s->current_block = s->n_blocks;
|
s->current_block = s->n_blocks;
|
||||||
|
|
||||||
|
@ -101,8 +107,11 @@ static int cloop_open(BlockDriverState *bs, int flags)
|
||||||
qemu_co_mutex_init(&s->lock);
|
qemu_co_mutex_init(&s->lock);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
cloop_close:
|
fail:
|
||||||
return -1;
|
g_free(s->offsets);
|
||||||
|
g_free(s->compressed_block);
|
||||||
|
g_free(s->uncompressed_block);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int cloop_read_block(BlockDriverState *bs, int block_num)
|
static inline int cloop_read_block(BlockDriverState *bs, int block_num)
|
||||||
|
|
Loading…
Reference in New Issue