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
master commit: 9cd7e31b3f
master date: 2022-04-26 10:23:58 +0200
This commit is contained in:
Juergen Gross authored and Jan Beulich committed 2022-06-07 14:18:01 +02:00
1 parent 2e6062aa82
commit 3b1031b3b4
4 files changed
+18 -14

No files matched your search

+1 -10
View File
@@ -174,16 +174,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
@@ -1374,7 +1374,7 @@ long arch_do_domctl(
break;
default:
ret = iommu_do_domctl(domctl, d, u_domctl);
ret = -ENOSYS;
break;
}
+7
View File
@@ -866,6 +866,13 @@ long 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
@@ -344,8 +344,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);
@@ -359,9 +368,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.