Daniel De Graaf
2013-Mar-27 17:43 UTC
[PATCH] xen/arch/x86: remove IS_PRIV access check bypasses
Several domctl functions dealing with rangesets contain a short-circuit bypass if the domain is privileged. Since the construction of domain 0 permits access to all I/O ranges, the call to irq_access_permitted will normally return true even without the IS_PRIV check, and the presence of the IS_PRIV check prevents the creation of a privileged domain without access to specific devices or IO memory ranges. Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov> --- xen/arch/x86/domctl.c | 12 ++++-------- xen/arch/x86/irq.c | 3 +-- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c index a196e2a..327a792 100644 --- a/xen/arch/x86/domctl.c +++ b/xen/arch/x86/domctl.c @@ -578,8 +578,7 @@ long arch_do_domctl( break; ret = -EPERM; - if ( !IS_PRIV(current->domain) && - !irq_access_permitted(current->domain, bind->machine_irq) ) + if ( !irq_access_permitted(current->domain, bind->machine_irq) ) break; ret = -ESRCH; @@ -602,8 +601,7 @@ long arch_do_domctl( bind = &(domctl->u.bind_pt_irq); ret = -EPERM; - if ( !IS_PRIV(current->domain) && - !irq_access_permitted(current->domain, bind->machine_irq) ) + if ( !irq_access_permitted(current->domain, bind->machine_irq) ) break; ret = xsm_unbind_pt_irq(XSM_HOOK, d, bind); @@ -637,8 +635,7 @@ long arch_do_domctl( break; ret = -EPERM; - if ( !IS_PRIV(current->domain) && - !iomem_access_permitted(current->domain, mfn, mfn + nr_mfns - 1) ) + if ( !iomem_access_permitted(current->domain, mfn, mfn + nr_mfns - 1) ) break; ret = xsm_iomem_mapping(XSM_HOOK, d, mfn, mfn + nr_mfns - 1, add); @@ -715,8 +712,7 @@ long arch_do_domctl( } ret = -EPERM; - if ( !IS_PRIV(current->domain) && - !ioports_access_permitted(current->domain, fmp, fmp + np - 1) ) + if ( !ioports_access_permitted(current->domain, fmp, fmp + np - 1) ) break; ret = xsm_ioport_mapping(XSM_HOOK, d, fmp, fmp + np - 1, add); diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c index ca829bb..17a3174 100644 --- a/xen/arch/x86/irq.c +++ b/xen/arch/x86/irq.c @@ -1852,8 +1852,7 @@ int map_domain_pirq( ASSERT(spin_is_locked(&d->event_lock)); - if ( !IS_PRIV(current->domain) && - !irq_access_permitted(current->domain, pirq)) + if ( !irq_access_permitted(current->domain, pirq)) return -EPERM; if ( pirq < 0 || pirq >= d->nr_pirqs || irq < 0 || irq >= nr_irqs ) -- 1.8.1.4