[PATCH 1/9] xen/arch/x86: remove IS_PRIV access check bypasses

Daniel De Graaf
Thu, 11 Apr 2013 20:13:32 -0000

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>
Cc: Keir Fraser <keir@xen.org>
Cc: Jan Beulich <jbeulich@suse.com>
---
 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 dffb33a..33480fe 100644
--- a/xen/arch/x86/irq.c
+++ b/xen/arch/x86/irq.c
@@ -1872,8 +1872,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