unsigned int node = domain_to_node(d);
if ( !guest_handle_is_null(a->extent_list) &&
- !guest_handle_okay(a->extent_list, a->nr_extents) )
+ !guest_handle_subrange_okay(a->extent_list, a->nr_done,
+ a->nr_extents-1) )
return;
if ( (a->extent_order != 0) &&
struct domain *d = a->domain;
unsigned int node = domain_to_node(d);
- if ( !guest_handle_okay(a->extent_list, a->nr_extents) )
+ if ( !guest_handle_subrange_okay(a->extent_list, a->nr_done,
+ a->nr_extents-1) )
return;
if ( (a->extent_order != 0) &&
unsigned long i, j;
xen_pfn_t gmfn;
- if ( !guest_handle_okay(a->extent_list, a->nr_extents) )
+ if ( !guest_handle_subrange_okay(a->extent_list, a->nr_done,
+ a->nr_extents-1) )
return;
for ( i = a->nr_done; i < a->nr_extents; i++ )
if ( op.nr_gpfns > (ULONG_MAX >> MEMOP_EXTENT_SHIFT) )
return -EINVAL;
- if ( !guest_handle_okay(op.gpfn_list, op.nr_gpfns) ||
- !guest_handle_okay(op.mfn_list, op.nr_gpfns) )
+ if ( !guest_handle_subrange_okay(op.gpfn_list, *progress, op.nr_gpfns-1) ||
+ !guest_handle_subrange_okay(op.mfn_list, *progress, op.nr_gpfns-1) )
return -EFAULT;
if ( op.domid == DOMID_SELF )
#define guest_handle_okay(hnd, nr) \
(shadow_mode_external(current->domain) || \
array_access_ok((hnd).p, (nr), sizeof(*(hnd).p)))
+#define guest_handle_subrange_okay(hnd, first, last) \
+ (shadow_mode_external(current->domain) || \
+ array_access_ok((hnd).p + (first), \
+ (last)-(first)+1, \
+ sizeof(*(hnd).p)))
#define __copy_to_guest_offset(hnd, off, ptr, nr) ({ \
const typeof(*(ptr)) *_s = (ptr); \
/* Since we run in real mode, we can safely access all addresses. That also
* means our __routines are identical to our "normal" routines. */
#define guest_handle_okay(hnd, nr) 1
+#define guest_handle_subrange_okay(hnd, first, last) 1
/*
* Copy an array of objects to guest context via a guest handle.