Skip to content

Commit 0739c2c

Browse files
Cong Zhangaxboe
authored andcommitted
virtio_blk: NULL out vqs to avoid double free on failed resume
The vblk->vqs releases during freeze. If resume fails before vblk->vqs is allocated, later freeze/remove may attempt to free vqs again. Set vblk->vqs to NULL after freeing to avoid double free. Signed-off-by: Cong Zhang <[email protected]> Acked-by: Jason Wang <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
1 parent 3451cf3 commit 0739c2c

1 file changed

Lines changed: 12 additions & 1 deletion

File tree

drivers/block/virtio_blk.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1027,8 +1027,13 @@ static int init_vq(struct virtio_blk *vblk)
10271027
out:
10281028
kfree(vqs);
10291029
kfree(vqs_info);
1030-
if (err)
1030+
if (err) {
10311031
kfree(vblk->vqs);
1032+
/*
1033+
* Set to NULL to prevent freeing vqs again during freezing.
1034+
*/
1035+
vblk->vqs = NULL;
1036+
}
10321037
return err;
10331038
}
10341039

@@ -1599,6 +1604,12 @@ static int virtblk_freeze_priv(struct virtio_device *vdev)
15991604

16001605
vdev->config->del_vqs(vdev);
16011606
kfree(vblk->vqs);
1607+
/*
1608+
* Set to NULL to prevent freeing vqs again after a failed vqs
1609+
* allocation during resume. Note that kfree() already handles NULL
1610+
* pointers safely.
1611+
*/
1612+
vblk->vqs = NULL;
16021613

16031614
return 0;
16041615
}

0 commit comments

Comments
 (0)