vfio: fix partial unmap
Partial unmap support was introduced in commitc13ca4e81c
("vfio: fix DMA mapping granularity for IOVA as VA"), and with it was added a check that dereferenced the IOMMU type to determine whether partial ummapping is supported for currently configured IOMMU type. In certain circumstances (such as when VFIO is supported, but no devices were bound to the VFIO driver), the IOMMU type pointer can be NULL. However, dereferencing of IOMMU type was guarded by access to the user maps list - that is, we were always checking the user map list first, and then, if we found a memory region that encloses the one we're trying to unmap, we would have performed the IOMMU type check. This ensured that the IOMMU type check will not cause any NULL pointer dereferences, because in order for an IOMMU type check to have been performed, there necessarily must have been at least one memory region that was previously mapped successfully, and that implies having a defined IOMMU type. When commit56259f7fc0
("vfio: allow partially unmapping adjacent memory") was introduced, the IOMMU type check was moved to before we were traversing the user mem maps list, thereby introducing a potential NULL dereference, because the IOMMU type access was no longer guarded by the user mem maps list traversal. Fix the issue by moving the IOMMU type check to after the user mem maps traversal, thereby ensuring that by the time the check happens, the IOMMU type is always valid. Fixes:56259f7fc0
("vfio: allow partially unmapping adjacent memory") Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com> Reviewed-by: David Marchand <david.marchand@redhat.com> Tested-by: Xuan Ding <xuan.ding@intel.com>
This commit is contained in:
parent
452c1916b0
commit
ab910a8068
@ -1943,9 +1943,6 @@ container_dma_unmap(struct vfio_config *vfio_cfg, uint64_t vaddr, uint64_t iova,
|
|||||||
* mappings, let's just rebuild them using information we have.
|
* mappings, let's just rebuild them using information we have.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* do we have partial unmap capability? */
|
|
||||||
has_partial_unmap = vfio_cfg->vfio_iommu_type->partial_unmap;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* first thing to do is check if there exists a mapping that includes
|
* first thing to do is check if there exists a mapping that includes
|
||||||
* the start and the end of our requested unmap. We need to collect all
|
* the start and the end of our requested unmap. We need to collect all
|
||||||
@ -1961,6 +1958,9 @@ container_dma_unmap(struct vfio_config *vfio_cfg, uint64_t vaddr, uint64_t iova,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* do we have partial unmap capability? */
|
||||||
|
has_partial_unmap = vfio_cfg->vfio_iommu_type->partial_unmap;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* if we don't support partial unmap, we must check if start and end of
|
* if we don't support partial unmap, we must check if start and end of
|
||||||
* current unmap region are chunk-aligned.
|
* current unmap region are chunk-aligned.
|
||||||
|
Loading…
Reference in New Issue
Block a user