x86: fix hypercall continuation cancellation in XENMAPSPACE_gmfn_range compat wrapper

When no continuation was established, there must also not be an attempt
to cancel it - hypercall_cancel_continuation(), in the non-HVM, non-
multicall case, adjusts the guest mode return address in a way assuming
that an earlier call hypercall_create_continuation() took place.

Once touching this code, also restructure it slightly to improve
readability and switch to using the more relaxed copy function (copying
from the same guest memory already validated the virtual address
range).

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Keir Fraser <keir@xen.org>
xen-unstable changeset: 26195:7670eabcbafc
xen-unstable date: Wed Nov 28 09:02:26 UTC 2012
This commit is contained in:
Jan Beulich committed 2012-12-06 11:07:56 +01:00
1 parent c90224367c
commit cd7dc899a6
1 file changed
+10 -11
+10 -11
View File
@@ -66,21 +66,20 @@ int compat_arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
XLAT_add_to_physmap(nat, &cmp);
rc = arch_memory_op(op, guest_handle_from_ptr(nat, void));
if ( cmp.space == XENMAPSPACE_gmfn_range )
if ( !rc || cmp.space != XENMAPSPACE_gmfn_range )
break;
XLAT_add_to_physmap(&cmp, nat);
if ( __copy_to_guest(arg, &cmp, 1) )
{
if ( rc )
{
XLAT_add_to_physmap(&cmp, nat);
if ( copy_to_guest(arg, &cmp, 1) )
{
hypercall_cancel_continuation();
return -EFAULT;
}
}
if ( rc == __HYPERVISOR_memory_op )
hypercall_xlat_continuation(NULL, 0x2, nat, arg);
hypercall_cancel_continuation();
return -EFAULT;
}
if ( rc == __HYPERVISOR_memory_op )
hypercall_xlat_continuation(NULL, 0x2, nat, arg);
break;
}
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.