Skip to content

Commit 79ea2fe

Browse files
duanzhenzhongjoergroedel
authored andcommitted
iommu/vt-d: Avoid NULL pointer dereference or refcount corruption
Commit 60f030f ("iommu/vt-d: Avoid use of NULL after WARN_ON_ONCE") fixed a NULL pointer dereference in an unlikely situation partly. If dev_pasid is not found in the dev_pasids list, it remains NULL. However, the teardown operations are executed unconditionally, this lead to a NULL pointer dereference or refcount corruption. If the domain was never attached to this IOMMU, info will be NULL, which would cause an immediate dereference when checking --info->refcnt. Even if info is not NULL, decrementing the refcount without having removed a valid PASID might unbalance the count. This could lead to premature dropping of the refcount to 0, potentially causing a use-after-free for the remaining active devices sharing the domain. Fix it by returning early if dev_pasid is NULL, before executing the teardown operations. Issue found by AI review and suggested by Kevin Tian. https://sashiko.dev/#/patchset/20260421031347.1408890-1-zhenzhong.duan%40intel.com Fixes: 60f030f ("iommu/vt-d: Avoid use of NULL after WARN_ON_ONCE") Cc: stable@vger.kernel.org Suggested-by: Kevin Tian <kevin.tian@intel.com> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> Reviewed-by: Kevin Tian <kevin.tian@intel.com> Link: https://lore.kernel.org/r/20260422033538.95000-1-zhenzhong.duan@intel.com Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
1 parent a6dea58 commit 79ea2fe

1 file changed

Lines changed: 5 additions & 4 deletions

File tree

drivers/iommu/intel/iommu.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3545,12 +3545,13 @@ void domain_remove_dev_pasid(struct iommu_domain *domain,
35453545
}
35463546
spin_unlock_irqrestore(&dmar_domain->lock, flags);
35473547

3548+
if (WARN_ON_ONCE(!dev_pasid))
3549+
return;
3550+
35483551
cache_tag_unassign_domain(dmar_domain, dev, pasid);
35493552
domain_detach_iommu(dmar_domain, iommu);
3550-
if (!WARN_ON_ONCE(!dev_pasid)) {
3551-
intel_iommu_debugfs_remove_dev_pasid(dev_pasid);
3552-
kfree(dev_pasid);
3553-
}
3553+
intel_iommu_debugfs_remove_dev_pasid(dev_pasid);
3554+
kfree(dev_pasid);
35543555
}
35553556

35563557
static int blocking_domain_set_dev_pasid(struct iommu_domain *domain,

0 commit comments

Comments
 (0)