summaryrefslogtreecommitdiff
path: root/block
diff options
context:
space:
mode:
authorKevin Wolf <kwolf@redhat.com>2014-05-07 17:30:30 +0200
committerMichael Roth <mdroth@linux.vnet.ibm.com>2014-07-20 22:30:36 -0500
commit5c85998739da2c904194a7fe985a0e7707c7da25 (patch)
tree8b9ce6859a464a72cdbd4cdeb3d51b8ab54c6f20 /block
parentd234c8f1f6bb52be075581d8237d4683b942bbe3 (diff)
downloadqemu-5c85998739da2c904194a7fe985a0e7707c7da25.tar.gz
qcow1: Check maximum cluster size
Huge values for header.cluster_bits cause unbounded allocations (e.g. for s->cluster_cache) and crash qemu this way. Less huge values may survive those allocations, but can cause integer overflows later on. The only cluster sizes that qemu can create are 4k (for standalone images) and 512 (for images with backing files), so we can limit it to 64k. Cc: qemu-stable@nongnu.org Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Benoit Canet <benoit@irqsave.net> (cherry picked from commit 7159a45b2bf2dcb9f49f1e27d1d3d135a0247a2f) Conflicts: tests/qemu-iotests/group *removed context lines for tests not present in v2.0.0 Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
Diffstat (limited to 'block')
-rw-r--r--block/qcow.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/block/qcow.c b/block/qcow.c
index 9018f44e64..26bb9235c3 100644
--- a/block/qcow.c
+++ b/block/qcow.c
@@ -127,11 +127,17 @@ static int qcow_open(BlockDriverState *bs, QDict *options, int flags,
goto fail;
}
- if (header.size <= 1 || header.cluster_bits < 9) {
- error_setg(errp, "invalid value in qcow header");
+ if (header.size <= 1) {
+ error_setg(errp, "Image size is too small (must be at least 2 bytes)");
ret = -EINVAL;
goto fail;
}
+ if (header.cluster_bits < 9 || header.cluster_bits > 16) {
+ error_setg(errp, "Cluster size must be between 512 and 64k");
+ ret = -EINVAL;
+ goto fail;
+ }
+
if (header.crypt_method > QCOW_CRYPT_AES) {
error_setg(errp, "invalid encryption method in qcow header");
ret = -EINVAL;