aboutsummaryrefslogtreecommitdiff
path: root/block
diff options
context:
space:
mode:
authorAlberto Garcia <berto@igalia.com>2017-11-03 16:18:52 +0200
committerMax Reitz <mreitz@redhat.com>2017-11-14 18:06:25 +0100
commit8aa34834d566ba4e635d6029339a5f4f1ae1685e (patch)
tree8708d307c07eb4f467d34f6bd0378234b6850792 /block
parent9883975050deffc147a3903d07ff995ecdc8a100 (diff)
downloadqemu-8aa34834d566ba4e635d6029339a5f4f1ae1685e.zip
qemu-8aa34834d566ba4e635d6029339a5f4f1ae1685e.tar.gz
qemu-8aa34834d566ba4e635d6029339a5f4f1ae1685e.tar.bz2
qcow2: Prevent allocating compressed clusters at offset 0
If the refcount data is corrupted then we can end up trying to allocate a new compressed cluster at offset 0 in the image, triggering an assertion in qcow2_alloc_bytes() that would crash QEMU: qcow2_alloc_bytes: Assertion `offset' failed. This patch adds an explicit check for this scenario and a new test case. Signed-off-by: Alberto Garcia <berto@igalia.com> Message-id: fb53467cf48e95ff3330def1cf1003a5b862b7d9.1509718618.git.berto@igalia.com Reviewed-by: Max Reitz <mreitz@redhat.com> Signed-off-by: Max Reitz <mreitz@redhat.com>
Diffstat (limited to 'block')
-rw-r--r--block/qcow2-refcount.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
index 9059996..60b8eef 100644
--- a/block/qcow2-refcount.c
+++ b/block/qcow2-refcount.c
@@ -1082,6 +1082,13 @@ int64_t qcow2_alloc_bytes(BlockDriverState *bs, int size)
return new_cluster;
}
+ if (new_cluster == 0) {
+ qcow2_signal_corruption(bs, true, -1, -1, "Preventing invalid "
+ "allocation of compressed cluster "
+ "at offset 0");
+ return -EIO;
+ }
+
if (!offset || ROUND_UP(offset, s->cluster_size) != new_cluster) {
offset = new_cluster;
free_in_cluster = s->cluster_size;