diff --git a/xen/common/domctl.c b/xen/common/domctl.c index b969f5ada6..c205ba802d 100644 --- a/xen/common/domctl.c +++ b/xen/common/domctl.c @@ -318,6 +318,26 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) break; } + /* Handle sub-ops not requiring the domctl lock. */ + switch ( op->cmd ) + { + case XEN_DOMCTL_getdomaininfo: + ret = xsm_getdomaininfo(XSM_XS_PRIV, d); + if ( !ret ) + { + getdomaininfo(d, &op->u.getdomaininfo); + + ASSERT(op->domain == op->u.getdomaininfo.domain); + copyback = true; + } + + goto domctl_out_unlock_domonly; + + default: + /* Everything else handled further down. */ + break; + } + ret = xsm_domctl(XSM_OTHER, d, op->cmd, /* SSIDRef only applicable for cmd == createdomain */ op->u.createdomain.ssidref); @@ -521,17 +541,6 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) copyback = 1; break; - case XEN_DOMCTL_getdomaininfo: - ret = xsm_getdomaininfo(XSM_XS_PRIV, d); - if ( ret ) - break; - - getdomaininfo(d, &op->u.getdomaininfo); - - op->domain = op->u.getdomaininfo.domain; - copyback = 1; - break; - case XEN_DOMCTL_getvcpucontext: { vcpu_guest_context_u c = { .nat = NULL }; diff --git a/xen/include/xsm/dummy.h b/xen/include/xsm/dummy.h index b8fd7aeedd..6ca4209108 100644 --- a/xen/include/xsm/dummy.h +++ b/xen/include/xsm/dummy.h @@ -172,9 +172,13 @@ static XSM_INLINE int cf_check xsm_domctl( case XEN_DOMCTL_bind_pt_irq: case XEN_DOMCTL_unbind_pt_irq: return xsm_default_action(XSM_DM_PRIV, current->domain, d); - case XEN_DOMCTL_getdomaininfo: case XEN_DOMCTL_get_domain_state: return xsm_default_action(XSM_XS_PRIV, current->domain, d); + + case XEN_DOMCTL_getdomaininfo: + ASSERT_UNREACHABLE(); + return -EILSEQ; + default: return xsm_default_action(XSM_PRIV, current->domain, d); } diff --git a/xen/xsm/flask/hooks.c b/xen/xsm/flask/hooks.c index 28522dcbd2..03413eac51 100644 --- a/xen/xsm/flask/hooks.c +++ b/xen/xsm/flask/hooks.c @@ -649,8 +649,12 @@ static int cf_check flask_domctl(struct domain *d, unsigned int cmd, */ return avc_current_has_perm(ssidref, SECCLASS_DOMAIN, DOMAIN__CREATE, NULL); - /* These have individual XSM hooks (common/domctl.c) */ + /* These have individual XSM hooks and don't make it here. */ case XEN_DOMCTL_getdomaininfo: + ASSERT_UNREACHABLE(); + return -EILSEQ; + + /* These have individual XSM hooks (common/domctl.c) */ case XEN_DOMCTL_scheduler_op: case XEN_DOMCTL_irq_permission: case XEN_DOMCTL_iomem_permission: