Skip to content

Commit 9022cb9

Browse files
duanzhenzhonggregkh
authored andcommitted
iommu/vt-d: Avoid NULL pointer dereference or refcount corruption
commit 79ea2feb917b05366b49d85573c9c5331f043b2c upstream. 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> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 88397fa commit 9022cb9

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
@@ -4083,12 +4083,13 @@ void domain_remove_dev_pasid(struct iommu_domain *domain,
40834083
}
40844084
spin_unlock_irqrestore(&dmar_domain->lock, flags);
40854085

4086+
if (WARN_ON_ONCE(!dev_pasid))
4087+
return;
4088+
40864089
cache_tag_unassign_domain(dmar_domain, dev, pasid);
40874090
domain_detach_iommu(dmar_domain, iommu);
4088-
if (!WARN_ON_ONCE(!dev_pasid)) {
4089-
intel_iommu_debugfs_remove_dev_pasid(dev_pasid);
4090-
kfree(dev_pasid);
4091-
}
4091+
intel_iommu_debugfs_remove_dev_pasid(dev_pasid);
4092+
kfree(dev_pasid);
40924093
}
40934094

40944095
static int blocking_domain_set_dev_pasid(struct iommu_domain *domain,

0 commit comments

Comments
 (0)