mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-09-06 18:05:37 +00:00
dmg: Handle failure for potentially large allocations
Some code in the block layer makes potentially huge allocations. Failure is not completely unexpected there, so avoid aborting qemu and handle out-of-memory situations gracefully. This patch addresses the allocations in the dmg block driver. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Benoit Canet <benoit@irqsave.net>
This commit is contained in:
parent
8dc7a7725b
commit
b546a94474
19
block/dmg.c
19
block/dmg.c
|
@ -284,8 +284,15 @@ static int dmg_open(BlockDriverState *bs, QDict *options, int flags,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* initialize zlib engine */
|
/* initialize zlib engine */
|
||||||
s->compressed_chunk = g_malloc(max_compressed_size + 1);
|
s->compressed_chunk = qemu_try_blockalign(bs->file,
|
||||||
s->uncompressed_chunk = g_malloc(512 * max_sectors_per_chunk);
|
max_compressed_size + 1);
|
||||||
|
s->uncompressed_chunk = qemu_try_blockalign(bs->file,
|
||||||
|
512 * max_sectors_per_chunk);
|
||||||
|
if (s->compressed_chunk == NULL || s->uncompressed_chunk == NULL) {
|
||||||
|
ret = -ENOMEM;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
if (inflateInit(&s->zstream) != Z_OK) {
|
if (inflateInit(&s->zstream) != Z_OK) {
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -302,8 +309,8 @@ fail:
|
||||||
g_free(s->lengths);
|
g_free(s->lengths);
|
||||||
g_free(s->sectors);
|
g_free(s->sectors);
|
||||||
g_free(s->sectorcounts);
|
g_free(s->sectorcounts);
|
||||||
g_free(s->compressed_chunk);
|
qemu_vfree(s->compressed_chunk);
|
||||||
g_free(s->uncompressed_chunk);
|
qemu_vfree(s->uncompressed_chunk);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -426,8 +433,8 @@ static void dmg_close(BlockDriverState *bs)
|
||||||
g_free(s->lengths);
|
g_free(s->lengths);
|
||||||
g_free(s->sectors);
|
g_free(s->sectors);
|
||||||
g_free(s->sectorcounts);
|
g_free(s->sectorcounts);
|
||||||
g_free(s->compressed_chunk);
|
qemu_vfree(s->compressed_chunk);
|
||||||
g_free(s->uncompressed_chunk);
|
qemu_vfree(s->uncompressed_chunk);
|
||||||
|
|
||||||
inflateEnd(&s->zstream);
|
inflateEnd(&s->zstream);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue