diff --git a/xen/common/compat/memory.c b/xen/common/compat/memory.c index 45e5fb0e5d..e3eb3c01a1 100644 --- a/xen/common/compat/memory.c +++ b/xen/common/compat/memory.c @@ -161,6 +161,11 @@ int compat_memory_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) if ( copy_from_guest(&cmp.xchg, arg, 1) ) return -EFAULT; + /* Early coarse check, as max_order() isn't available here. */ + if ( cmp.xchg.in.extent_order >= 32 || + cmp.xchg.out.extent_order >= 32 ) + return -EPERM; + order_delta = cmp.xchg.out.extent_order - cmp.xchg.in.extent_order; /* Various sanity checks. */ if ( (cmp.xchg.nr_exchanged > cmp.xchg.in.nr_extents) ||