]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
virtio_pci: fix use after free on release
authorMichael S. Tsirkin <mst@redhat.com>
Thu, 14 Jan 2016 14:00:41 +0000 (16:00 +0200)
committerChuck Anderson <chuck.anderson@oracle.com>
Thu, 26 May 2016 22:44:33 +0000 (15:44 -0700)
Orabug: 23330783

[ Upstream commit 2989be09a8a9d62a785137586ad941f916e08f83 ]

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: 63bd62a08ca4 ("virtio_pci: defer kfree until release callback")
Reported-by: Jerome Marchand <jmarchan@redhat.com>
Cc: stable@vger.kernel.org
Cc: Sasha Levin <sasha.levin@oracle.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Tested-by: Jerome Marchand <jmarchan@redhat.com>
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
(cherry picked from commit 593bd1058b30eb4f0d6949afdfd9c2659d94ae1e)

Signed-off-by: Dan Duval <dan.duval@oracle.com>
drivers/virtio/virtio_pci_common.c

index eba1b7ac729454d30b1d611cd01d45b5ba23407e..14f767e8e5c5579eea581c092b2611643b76751e 100644 (file)
@@ -554,6 +554,7 @@ err_enable_device:
 static void virtio_pci_remove(struct pci_dev *pci_dev)
 {
        struct virtio_pci_device *vp_dev = pci_get_drvdata(pci_dev);
+       struct device *dev = get_device(&vp_dev->vdev.dev);
 
        unregister_virtio_device(&vp_dev->vdev);
 
@@ -564,6 +565,7 @@ static void virtio_pci_remove(struct pci_dev *pci_dev)
 
        pci_release_regions(pci_dev);
        pci_disable_device(pci_dev);
+       put_device(dev);
 }
 
 static struct pci_driver virtio_pci_driver = {