xen/iommu: cleanup iommu related domctl handling

Today iommu_do_domctl() is being called from arch_do_domctl() in the
"default:" case of a switch statement. This has led already to crashes
due to unvalidated parameters.

Fix that by moving the call of iommu_do_domctl() to the main switch
statement of do_domctl().

Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org> # Arm
This commit is contained in:
Juergen Gross authored and Jan Beulich committed 2022-04-26 10:23:58 +02:00
1 parent 2419a159fb
commit 9cd7e31b3f
4 files changed
+18 -14

No files matched your search

+1 -10
View File
@@ -176,16 +176,7 @@ long arch_do_domctl(struct xen_domctl *domctl, struct domain *d,
return rc;
}
default:
{
int rc;
rc = subarch_do_domctl(domctl, d, u_domctl);
if ( rc == -ENOSYS )
rc = iommu_do_domctl(domctl, d, u_domctl);
return rc;
}
return subarch_do_domctl(domctl, d, u_domctl);
}
}
+1 -1
View File
@@ -1370,7 +1370,7 @@ long arch_do_domctl(
break;
default:
ret = iommu_do_domctl(domctl, d, u_domctl);
ret = -ENOSYS;
break;
}
+7
View File
@@ -871,6 +871,13 @@ long cf_check do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl)
copyback = 1;
break;
case XEN_DOMCTL_assign_device:
case XEN_DOMCTL_test_assign_device:
case XEN_DOMCTL_deassign_device:
case XEN_DOMCTL_get_device_group:
ret = iommu_do_domctl(op, d, u_domctl);
break;
default:
ret = arch_do_domctl(op, d, u_domctl);
break;
+9 -3
View File
@@ -342,8 +342,17 @@ struct domain_iommu {
/* Does the IOMMU pagetable need to be kept synchronized with the P2M */
#ifdef CONFIG_HAS_PASSTHROUGH
#define need_iommu_pt_sync(d) (dom_iommu(d)->need_sync)
int iommu_do_domctl(struct xen_domctl *domctl, struct domain *d,
XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl);
#else
#define need_iommu_pt_sync(d) ({ (void)(d); false; })
static inline int iommu_do_domctl(struct xen_domctl *domctl, struct domain *d,
XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl)
{
return -ENOSYS;
}
#endif
int __must_check iommu_suspend(void);
@@ -357,9 +366,6 @@ int iommu_do_pci_domctl(struct xen_domctl *, struct domain *d,
XEN_GUEST_HANDLE_PARAM(xen_domctl_t));
#endif
int iommu_do_domctl(struct xen_domctl *, struct domain *d,
XEN_GUEST_HANDLE_PARAM(xen_domctl_t));
void iommu_dev_iotlb_flush_timeout(struct domain *d, struct pci_dev *pdev);
/*
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.