diff options
| author | Hikaru Nishida | 2020-02-09 18:51:56 +0100 |
|---|---|---|
| committer | Kevin Wolf | 2020-02-18 10:53:56 +0100 |
| commit | 8475ea48544b313cf533312846a4899ddecb799c (patch) | |
| tree | 9f7398065c697fc3118db709ce6df189a7cdcb2c /block | |
| parent | qcow2: Fix alignment checks in encrypted images (diff) | |
| download | qemu-8475ea48544b313cf533312846a4899ddecb799c.tar.gz qemu-8475ea48544b313cf533312846a4899ddecb799c.tar.xz qemu-8475ea48544b313cf533312846a4899ddecb799c.zip | |
block/vvfat: Do not unref qcow on closing backing bdrv
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 <hikarupsp@gmail.com>
Message-Id: <20200209175156.85748-1-hikarupsp@gmail.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'block')
| -rw-r--r-- | block/vvfat.c | 7 |
1 files changed, 0 insertions, 7 deletions
diff --git a/block/vvfat.c b/block/vvfat.c index 019b8f1341..ab800c4887 100644 --- a/block/vvfat.c +++ b/block/vvfat.c @@ -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, |
