Message ID | 20230710074848.456453-8-clg@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [PULL,01/11] hw/vfio/pci-quirks: Sanitize capability pointer | expand |
10.07.2023 10:48, Cédric Le Goater пишет: > From: Avihai Horon <avihaih@nvidia.com> > > vfio_realize() has the following flow: > 1. vfio_bars_prepare() -- sets VFIOBAR->size. > 2. msix_early_setup(). > 3. vfio_bars_register() -- allocates VFIOBAR->mr. > > After vfio_bars_prepare() is called msix_early_setup() can fail. If it > does fail, vfio_bars_register() is never called and VFIOBAR->mr is not > allocated. > > In this case, vfio_bars_finalize() is called as part of the error flow > to free the bars' resources. However, vfio_bars_finalize() calls > object_unparent() for VFIOBAR->mr after checking only VFIOBAR->size, and > thus we get a null pointer dereference. > > Fix it by checking VFIOBAR->mr in vfio_bars_finalize(). > > Fixes: 89d5202edc50 ("vfio/pci: Allow relocating MSI-X MMIO") > Signed-off-by: Avihai Horon <avihaih@nvidia.com> It looks like it's a -stable material too. Queued this one. If it shouldn't go to stable, please let me know. Thanks, /mjt
diff --git a/hw/vfio/pci.c b/hw/vfio/pci.c index 68dd99283620..c89fdf7ae6c2 100644 --- a/hw/vfio/pci.c +++ b/hw/vfio/pci.c @@ -1752,9 +1752,11 @@ static void vfio_bars_finalize(VFIOPCIDevice *vdev) vfio_bar_quirk_finalize(vdev, i); vfio_region_finalize(&bar->region); - if (bar->size) { + if (bar->mr) { + assert(bar->size); object_unparent(OBJECT(bar->mr)); g_free(bar->mr); + bar->mr = NULL; } }