Skip to content

Commit

Permalink
xen/common: event_channel: Don't ignore error in get_free_port()
Browse files Browse the repository at this point in the history
Currently, get_free_port() is assuming that the port has been allocated
when evtchn_allocate_port() is not return -EBUSY.

However, the function may return an error when:
    - We exhausted all the event channels. This can happen if the limit
    configured by the administrator for the guest ('max_event_channels'
    in xl cfg) is higher than the ABI used by the guest. For instance,
    if the guest is using 2L, the limit should not be higher than 4095.
    - We cannot allocate memory (e.g Xen has not more memory).

Users of get_free_port() (such as EVTCHNOP_alloc_unbound) will validly
assuming the port was valid and will next call evtchn_from_port(). This
will result to a crash as the memory backing the event channel structure
is not present.

Fixes: 368ae9a ("xen/pvshim: forward evtchn ops between L0 Xen and L2 DomU")
Signed-off-by: Julien Grall <jgrall@amazon.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
  • Loading branch information
Julien Grall authored and jbeulich committed Jul 7, 2020
1 parent f97f99c commit 2e9c2bc
Showing 1 changed file with 4 additions and 4 deletions.
8 changes: 4 additions & 4 deletions xen/common/event_channel.c
Original file line number Diff line number Diff line change
Expand Up @@ -195,10 +195,10 @@ static int get_free_port(struct domain *d)
{
int rc = evtchn_allocate_port(d, port);

if ( rc == -EBUSY )
continue;

return port;
if ( rc == 0 )
return port;
else if ( rc != -EBUSY )
return rc;
}

return -ENOSPC;
Expand Down

0 comments on commit 2e9c2bc

Please sign in to comment.