]> Git Repo - qemu.git/commitdiff
block/vvfat: Do not unref qcow on closing backing bdrv
authorHikaru Nishida <[email protected]>
Sun, 9 Feb 2020 17:51:56 +0000 (02:51 +0900)
committerKevin Wolf <[email protected]>
Tue, 18 Feb 2020 09:53:56 +0000 (10:53 +0100)
Before this commit, BDRVVVFATState.qcow is unrefed in write_target_close
on closing backing bdrv of vvfat. However, qcow bdrv is opend as a child
of vvfat in enable_write_target() so it will be also unrefed on closing
vvfat itself. This causes use-after-free of qcow on freeing vvfat which
has backing bdrv and qcow bdrv as children in this order because
bdrv_close(vvfat) tries to free qcow bdrv after freeing backing bdrv
as QLIST_FOREACH_SAFE() loop keeps next pointer, but BdrvChild of qcow
is already freed in bdrv_close(backing bdrv).

Signed-off-by: Hikaru Nishida <[email protected]>
Message-Id: <20200209175156[email protected]>
Signed-off-by: Kevin Wolf <[email protected]>
block/vvfat.c

index 019b8f1341393ccec545982ecea6f052d3263a58..ab800c4887a2015a844900100bbba8f9b16db398 100644 (file)
@@ -3124,17 +3124,10 @@ write_target_commit(BlockDriverState *bs, uint64_t offset, uint64_t bytes,
     return ret;
 }
 
-static void write_target_close(BlockDriverState *bs) {
-    BDRVVVFATState* s = *((BDRVVVFATState**) bs->opaque);
-    bdrv_unref_child(s->bs, s->qcow);
-    g_free(s->qcow_filename);
-}
-
 static BlockDriver vvfat_write_target = {
     .format_name        = "vvfat_write_target",
     .instance_size      = sizeof(void*),
     .bdrv_co_pwritev    = write_target_commit,
-    .bdrv_close         = write_target_close,
 };
 
 static void vvfat_qcow_options(int *child_flags, QDict *child_options,
This page took 0.030441 seconds and 4 git commands to generate.