[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] Introduce guest_handle_subrange_okay() for checking sub-sections of an
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1213361396 -3600 # Node ID 6e92603ed9f29d8599d330af7b69d443d1155340 # Parent 08fb9a4489f7b076e6177de7fc9dc746855a39a6 Introduce guest_handle_subrange_okay() for checking sub-sections of an argument array. Needed where a compat shim is splitting up a 32-bit guest's larger argument array, and only the currently-active part of the translated array is contained within the compat_arg_xlat_area. Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx> --- xen/common/memory.c | 13 ++++++++----- xen/include/asm-x86/guest_access.h | 5 +++++ xen/include/xen/xencomm.h | 1 + 3 files changed, 14 insertions(+), 5 deletions(-) diff -r 08fb9a4489f7 -r 6e92603ed9f2 xen/common/memory.c --- a/xen/common/memory.c Fri Jun 13 13:48:13 2008 +0100 +++ b/xen/common/memory.c Fri Jun 13 13:49:56 2008 +0100 @@ -47,7 +47,8 @@ static void increase_reservation(struct 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) && @@ -94,7 +95,8 @@ static void populate_physmap(struct memo 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) && @@ -179,7 +181,8 @@ static void decrease_reservation(struct 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++ ) @@ -219,8 +222,8 @@ static long translate_gpfn_list( 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 ) diff -r 08fb9a4489f7 -r 6e92603ed9f2 xen/include/asm-x86/guest_access.h --- a/xen/include/asm-x86/guest_access.h Fri Jun 13 13:48:13 2008 +0100 +++ b/xen/include/asm-x86/guest_access.h Fri Jun 13 13:49:56 2008 +0100 @@ -79,6 +79,11 @@ #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); \ diff -r 08fb9a4489f7 -r 6e92603ed9f2 xen/include/xen/xencomm.h --- a/xen/include/xen/xencomm.h Fri Jun 13 13:48:13 2008 +0100 +++ b/xen/include/xen/xencomm.h Fri Jun 13 13:49:56 2008 +0100 @@ -62,6 +62,7 @@ static inline unsigned long xencomm_inli /* 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. _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |