Skip to content

Commit 2989be0

Browse files
committed
virtio_pci: fix use after free on release
KASan detected a use-after-free error in virtio-pci remove code. In virtio_pci_remove(), vp_dev is still used after being freed in unregister_virtio_device() (in virtio_pci_release_dev() more precisely). To fix, keep a reference until cleanup is done. Fixes: 63bd62a ("virtio_pci: defer kfree until release callback") Reported-by: Jerome Marchand <[email protected]> Cc: [email protected] Cc: Sasha Levin <[email protected]> Signed-off-by: Michael S. Tsirkin <[email protected]> Tested-by: Jerome Marchand <[email protected]>
1 parent 92e963f commit 2989be0

File tree

1 file changed

+2
-0
lines changed

1 file changed

+2
-0
lines changed

drivers/virtio/virtio_pci_common.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,7 @@ static int virtio_pci_probe(struct pci_dev *pci_dev,
545545
static void virtio_pci_remove(struct pci_dev *pci_dev)
546546
{
547547
struct virtio_pci_device *vp_dev = pci_get_drvdata(pci_dev);
548+
struct device *dev = get_device(&vp_dev->vdev.dev);
548549

549550
unregister_virtio_device(&vp_dev->vdev);
550551

@@ -554,6 +555,7 @@ static void virtio_pci_remove(struct pci_dev *pci_dev)
554555
virtio_pci_modern_remove(vp_dev);
555556

556557
pci_disable_device(pci_dev);
558+
put_device(dev);
557559
}
558560

559561
static struct pci_driver virtio_pci_driver = {

0 commit comments

Comments
 (0)