]> Git Repo - qemu.git/commitdiff
qcow2-cluster: Fix integer left shift error in qcow2_alloc_cluster_link_l2()
authorTuguoyi <[email protected]>
Wed, 5 Aug 2020 09:22:58 +0000 (09:22 +0000)
committerPeter Maydell <[email protected]>
Wed, 5 Aug 2020 13:56:11 +0000 (14:56 +0100)
When calculating the offset, the result of left shift operation will be promoted
to type int64 automatically because the left operand of + operator is uint64_t.
but the result after integer promotion may be produce an error value for us and
trigger the following asserting error.

For example, consider i=0x2000, cluster_bits=18, the result of left shift
operation will be 0x80000000. Cause argument i is of signed integer type,
the result is automatically promoted to 0xffffffff80000000 which is not
we expected

The way to trigger the assertion error:
  qemu-img create -f qcow2 -o preallocation=full,cluster_size=256k tmpdisk 10G

This patch fix it by casting @i to uint64_t before doing left shift operation

Signed-off-by: Guoyi Tu <[email protected]>
Reviewed-by: Eric Blake <[email protected]>
Reviewed-by: Kevin Wolf <[email protected]>
Reviewed-by: Alberto Garcia <[email protected]>
Message-id: 81ba90fe0c014f269621c283269b42ad@h3c.com
Signed-off-by: Peter Maydell <[email protected]>
block/qcow2-cluster.c

index a677ba9f5c6a1613be2c104dce968a783d480f1c..550850b264e85953b64986e1cf6891370998ccc0 100644 (file)
@@ -980,7 +980,7 @@ int qcow2_alloc_cluster_link_l2(BlockDriverState *bs, QCowL2Meta *m)
 
     assert(l2_index + m->nb_clusters <= s->l2_slice_size);
     for (i = 0; i < m->nb_clusters; i++) {
-        uint64_t offset = cluster_offset + (i << s->cluster_bits);
+        uint64_t offset = cluster_offset + ((uint64_t)i << s->cluster_bits);
         /* if two concurrent writes happen to the same unallocated cluster
          * each write allocates separate cluster and writes data concurrently.
          * The first one to complete updates l2 table with pointer to its
This page took 0.030817 seconds and 4 git commands to generate.