diff --git a/xen/arch/x86/memory.c b/xen/arch/x86/memory.c index 30688db3da..ad1d6f0ef5 100644 --- a/xen/arch/x86/memory.c +++ b/xen/arch/x86/memory.c @@ -403,7 +403,7 @@ get_page_from_l1e( return ((l1v & _PAGE_RW) ? get_page_and_type(page, d, PGT_writable_page) : - get_page(d)); + get_page(page, d)); } diff --git a/xen/common/event_channel.c b/xen/common/event_channel.c index fe47b9e524..ca2eb46f12 100644 --- a/xen/common/event_channel.c +++ b/xen/common/event_channel.c @@ -167,9 +167,12 @@ static long evtchn_bind_interdomain(evtchn_bind_interdomain_t *bind) break; case ECS_INTERDOMAIN: - rc = ((d1->event_channel[port1].u.interdomain.remote_dom != d2) || - (d1->event_channel[port1].u.interdomain.remote_port != port2)) ? - -EINVAL : 0; + if ( d1->event_channel[port1].u.interdomain.remote_dom != d2 ) + ERROR_EXIT(-EINVAL); + if ( (d1->event_channel[port1].u.interdomain.remote_port != port2) && + (bind->port2 != 0) ) + ERROR_EXIT(-EINVAL); + port2 = d1->event_channel[port1].u.interdomain.remote_port; goto out; default: @@ -189,6 +192,15 @@ static long evtchn_bind_interdomain(evtchn_bind_interdomain_t *bind) ERROR_EXIT(-EINVAL); break; + case ECS_INTERDOMAIN: + if ( d2->event_channel[port2].u.interdomain.remote_dom != d1 ) + ERROR_EXIT(-EINVAL); + if ( (d2->event_channel[port2].u.interdomain.remote_port != port1) && + (bind->port1 != 0) ) + ERROR_EXIT(-EINVAL); + port1 = d2->event_channel[port2].u.interdomain.remote_port; + goto out; + default: ERROR_EXIT(-EINVAL); }