• Juergen Gross's avatar
    xen/events: avoid removing an event channel while handling it · 073d0552
    Juergen Gross authored
    Today it can happen that an event channel is being removed from the
    system while the event handling loop is active. This can lead to a
    race resulting in crashes or WARN() splats when trying to access the
    irq_info structure related to the event channel.
    
    Fix this problem by using a rwlock taken as reader in the event
    handling loop and as writer when deallocating the irq_info structure.
    
    As the observed problem was a NULL dereference in evtchn_from_irq()
    make this function more robust against races by testing the irq_info
    pointer to be not NULL before dereferencing it.
    
    And finally make all accesses to evtchn_to_irq[row][col] atomic ones
    in order to avoid seeing partial updates of an array element in irq
    handling. Note that irq handling can be entered only for event channels
    which have been valid before, so any not populated row isn't a problem
    in this regard, as rows are only ever added and never removed.
    
    This is XSA-331.
    
    Cc: stable@vger.kernel.org
    Reported-by: default avatarMarek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
    Reported-by: default avatarJinoh Kang <luke1337@theori.io>
    Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
    Reviewed-by: default avatarStefano Stabellini <sstabellini@kernel.org>
    Reviewed-by: default avatarWei Liu <wl@xen.org>
    073d0552
events_base.c 39.1 KB