Skip to contentSkip to conversation

virtio-pci: fix use after free

PATCH Applied Michael S. Tsirkin 3 participants 4 messages Nov 7, 2011 – Nov 8, 2011 virtio core

lore
Share & tools
lore

Michael S. Tsirkin

author maintainer
#0 lore raw

PATCH 1/1 virtio-pci: fix use after free

Commit 31a3ddda166cda86d2b5111e09ba4bda5239fae6 introduced a use after free in virtio-pci. The main issue is that the release method signals removal of the virtio device, while remove signals removal of the pci device.

For example, on driver removal or hot-unplug, virtio_pci_release_dev is called before virtio_pci_remove. We then might get a crash as virtio_pci_remove tries to use the device freed by virtio_pci_release_dev.

We allocate/free all resources together with the pci device, so we can leave the release method empty.

---
 drivers/virtio/virtio_pci.c |   11 ++++++-----
 1 files changed, 6 insertions(+), 5 deletions(-)
drivers/virtio/virtio_pci.c +6 -5
index d4ed130..a989b41 100644
@@ -730,11 +730,11 @@ static struct virtio_config_ops virtio_pci_config_ops = {
 
 static void virtio_pci_release_dev(struct device *_d)
 {
-	struct virtio_device *dev = container_of(_d, struct virtio_device,
-						 dev);
-	struct virtio_pci_device *vp_dev = to_vp_device(dev);
-
-	kfree(vp_dev);
+	/*
+	 * No need for a release method as we allocate/free
+	 * all devices together with the pci devices.
+	 * Provide an empty one to avoid getting a warning from core.
+	 */
 }
 
 /* the PCI probing function */
@@ -822,6 +822,7 @@ static void __devexit virtio_pci_remove(struct pci_dev *pci_dev)
 	virtio_pci_iounmap(vp_dev);
 	pci_release_regions(pci_dev);
 	pci_disable_device(pci_dev);
+	kfree(vp_dev);
 }
 
 #ifdef CONFIG_PM
Signature · 1 line
1.7.5.53.gc233e
#1 lore raw
Quoted 10 lines · Michael S. Tsirkin

Commit 31a3ddda166cda86d2b5111e09ba4bda5239fae6 introduced a use after free in virtio-pci. The main issue is that the release method signals removal of the virtio device, while remove signals removal of the pci device.

For example, on driver removal or hot-unplug, virtio_pci_release_dev is called before virtio_pci_remove. We then might get a crash as virtio_pci_remove tries to use the device freed by virtio_pci_release_dev.

Quoted 4 lines

We allocate/free all resources together with the pci device, so we can leave the release method empty.

Applied, thanks. Will push once it's spent a day in linux-next.

Thanks,
Rusty.

Acked-by on v1 1/1
#2 lore raw
In reply to Michael S. Tsirkin
Quoted 10 lines · Michael S. Tsirkin

Commit 31a3ddda166cda86d2b5111e09ba4bda5239fae6 introduced a use after free in virtio-pci. The main issue is that the release method signals removal of the virtio device, while remove signals removal of the pci device.

For example, on driver removal or hot-unplug, virtio_pci_release_dev is called before virtio_pci_remove. We then might get a crash as virtio_pci_remove tries to use the device freed by virtio_pci_release_dev.

Quoted 4 lines

We allocate/free all resources together with the pci device, so we can leave the release method empty.

(note: Adding CC: [email protected] to the commit log is the way patches get automatically pulled from upstream when committed; CC'ing stable on submissions won't help with that.)

Amit

#3 lore raw
Quoted 14 lines · Amit Shah
Quoted 13 lines · Michael S. Tsirkin

Commit 31a3ddda166cda86d2b5111e09ba4bda5239fae6 introduced a use after free in virtio-pci. The main issue is that the release method signals removal of the virtio device, while remove signals removal of the pci device.

For example, on driver removal or hot-unplug, virtio_pci_release_dev is called before virtio_pci_remove. We then might get a crash as virtio_pci_remove tries to use the device freed by virtio_pci_release_dev.

We allocate/free all resources together with the pci device, so we can leave the release method empty.

Quoted 7 lines
Quoted 1 line

(note: Adding CC: [email protected] to the commit log is the way patches get automatically pulled from upstream when committed; CC'ing stable on submissions won't help with that.)

Yeah, I fixed it though.

Cheers,
Rusty.