Re: [PATCH v5 3/7] iommu: Validate that devices match domains

From: Robin Murphy
Date: Wed Oct 25 2023 - 08:40:03 EST


On 24/10/2023 7:52 pm, Jason Gunthorpe wrote:
On Wed, Oct 11, 2023 at 07:14:50PM +0100, Robin Murphy wrote:

@@ -2279,10 +2280,16 @@ struct iommu_domain *iommu_get_dma_domain(struct device *dev)
static int __iommu_attach_group(struct iommu_domain *domain,
struct iommu_group *group)
{
+ struct device *dev;
+
if (group->domain && group->domain != group->default_domain &&
group->domain != group->blocking_domain)
return -EBUSY;
+ dev = iommu_group_first_dev(group);
+ if (!dev_has_iommu(dev) || dev_iommu_ops(dev) != domain->owner)
+ return -EINVAL;

I was thinking about this later, how does this work for the global
static domains? domain->owner will not be set?

if (alloc_type == IOMMU_DOMAIN_IDENTITY && ops->identity_domain)
return ops->identity_domain;
else if (alloc_type == IOMMU_DOMAIN_BLOCKED && ops->blocked_domain)
return ops->blocked_domain;

Seems like it will break everything?

I don't believe it makes any significant difference - as the commit message points out, this validation is only applied at the public interface boundaries of iommu_attach_group(), iommu_attach_device(), and iommu_attach_device_pasid(), which are only expected to be operating on explicitly-allocated unmanaged domains. For internal default domain attachment, the domain is initially derived from the device/group itself so we know it's appropriate by construction.

I guess this *would* now prevent some external caller reaching in and trying to attach something to some other group's identity default domain, but frankly it feels like making that fail would be no bad thing anyway.

Thanks,
Robin.