vfio/pci: Fix double free in dma-buf feature

The error path through vfio_pci_core_feature_dma_buf() ignores its
own advice to only use dma_buf_put() after dma_buf_export(), instead
falling through the entire unwind chain.  In the unlikely event that
we encounter file descriptor exhaustion, this can result in an
unbalanced refcount on the vfio device and double free of allocated
objects.

Avoid this by moving the "put" directly into the error path and return
the errno rather than entering the unwind chain.

Reported-by: Renato Marziano <renato@marziano.top>
Fixes: 5d74781ebc ("vfio/pci: Add dma-buf export support for MMIO regions")
Cc: stable@vger.kernel.org
Acked-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Alex Williamson <alex.williamson@nvidia.com>
Link: https://lore.kernel.org/r/20260323215659.2108191-3-alex.williamson@nvidia.com
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Alex Williamson <alex@shazbot.org>
This commit is contained in:
Alex Williamson 2026-03-23 15:56:58 -06:00 committed by Alex Williamson
parent 6de23f81a5
commit e98137f0a8
1 changed files with 2 additions and 3 deletions

View File

@ -301,11 +301,10 @@ int vfio_pci_core_feature_dma_buf(struct vfio_pci_core_device *vdev, u32 flags,
*/ */
ret = dma_buf_fd(priv->dmabuf, get_dma_buf.open_flags); ret = dma_buf_fd(priv->dmabuf, get_dma_buf.open_flags);
if (ret < 0) if (ret < 0)
goto err_dma_buf; dma_buf_put(priv->dmabuf);
return ret; return ret;
err_dma_buf:
dma_buf_put(priv->dmabuf);
err_dev_put: err_dev_put:
vfio_device_put_registration(&vdev->vdev); vfio_device_put_registration(&vdev->vdev);
err_free_phys: err_free_phys: