]> git.ipfire.org Git - thirdparty/qemu.git/commitdiff
qcow2: Fix qcow2_alloc_cluster_abort() for external data file
authorKevin Wolf <kwolf@redhat.com>
Tue, 11 Feb 2020 09:48:59 +0000 (10:48 +0100)
committerMichael Roth <mdroth@linux.vnet.ibm.com>
Tue, 2 Jun 2020 15:48:40 +0000 (10:48 -0500)
For external data file, cluster allocations return an offset in the data
file and are not refcounted. In this case, there is nothing to do for
qcow2_alloc_cluster_abort(). Freeing the same offset in the qcow2 file
is wrong and causes crashes in the better case or image corruption in
the worse case.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Message-Id: <20200211094900.17315-3-kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
(cherry picked from commit c3b6658c1a5a3fb24d6c27b2594cf86146f75b22)
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
block/qcow2-cluster.c

index 8982b7b762ee1d1cf465a659d02366bf538de79e..dc3c2702261b1ee2e00a3f5553db8e9352ee8539 100644 (file)
@@ -1015,8 +1015,11 @@ err:
 void qcow2_alloc_cluster_abort(BlockDriverState *bs, QCowL2Meta *m)
 {
     BDRVQcow2State *s = bs->opaque;
-    qcow2_free_clusters(bs, m->alloc_offset, m->nb_clusters << s->cluster_bits,
-                        QCOW2_DISCARD_NEVER);
+    if (!has_data_file(bs)) {
+        qcow2_free_clusters(bs, m->alloc_offset,
+                            m->nb_clusters << s->cluster_bits,
+                            QCOW2_DISCARD_NEVER);
+    }
 }
 
 /*