create_channel($2, $1, $2_channel)
allow $1 $2_channel:event create;
- allow $1 $2_target:domain shutdown;
+ allow $1 $2_target:domain { getdomaininfo shutdown };
allow $1 $2_target:mmu { map_read map_write adjust physmap target_hack };
allow $1 $2_target:hvm { getparam setparam trackdirtyvram hvmctl irqlevel pciroute pcilevel cacheattr send_irq };
')
switch ( op->cmd )
{
case XEN_DOMCTL_createdomain:
- case XEN_DOMCTL_getdomaininfo:
case XEN_DOMCTL_test_assign_device:
case XEN_DOMCTL_gdbsx_guestmemio:
d = NULL;
break;
default:
d = rcu_lock_domain_by_id(op->domain);
- if ( d == NULL )
+ if ( !d && op->cmd != XEN_DOMCTL_getdomaininfo )
return -ESRCH;
}
case XEN_DOMCTL_getdomaininfo:
{
- domid_t dom = op->domain;
-
- rcu_read_lock(&domlist_read_lock);
+ domid_t dom = DOMID_INVALID;
- for_each_domain ( d )
- if ( d->domain_id >= dom )
+ if ( !d )
+ {
+ ret = -EINVAL;
+ if ( op->domain >= DOMID_FIRST_RESERVED )
break;
+ rcu_read_lock(&domlist_read_lock);
+
+ dom = op->domain;
+ for_each_domain ( d )
+ if ( d->domain_id >= dom )
+ break;
+ }
+
ret = -ESRCH;
if ( d == NULL )
goto getdomaininfo_out;
copyback = 1;
getdomaininfo_out:
+ /* When d was non-NULL upon entry, no cleanup is needed. */
+ if ( dom == DOMID_INVALID )
+ break;
+
rcu_read_unlock(&domlist_read_lock);
d = NULL;
break;
return 0;
case XSM_TARGET:
if ( src == target )
+ {
return 0;
+ case XSM_XS_PRIV:
+ if ( src->is_xenstore )
+ return 0;
+ }
/* fall through */
case XSM_DM_PRIV:
if ( target && src->target == target )
if ( src->is_privileged )
return 0;
return -EPERM;
- case XSM_XS_PRIV:
- if ( src->is_xenstore || src->is_privileged )
- return 0;
- return -EPERM;
default:
LINKER_BUG_ON(1);
return -EPERM;