• Juergen Gross's avatar
    xen/blkfront: don't use gnttab_query_foreign_access() for mapped status · abf1fd59
    Juergen Gross authored
    It isn't enough to check whether a grant is still being in use by
    calling gnttab_query_foreign_access(), as a mapping could be realized
    by the other side just after having called that function.
    
    In case the call was done in preparation of revoking a grant it is
    better to do so via gnttab_end_foreign_access_ref() and check the
    success of that operation instead.
    
    For the ring allocation use alloc_pages_exact() in order to avoid
    high order pages in case of a multi-page ring.
    
    If a grant wasn't unmapped by the backend without persistent grants
    being used, set the device state to "error".
    
    This is CVE-2022-23036 / part of XSA-396.
    Reported-by: default avatarDemi Marie Obenour <demi@invisiblethingslab.com>
    Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
    Reviewed-by: default avatarRoger Pau Monné <roger.pau@citrix.com>
    ---
    V2:
    - use gnttab_try_end_foreign_access()
    V4:
    - use alloc_pages_exact() and free_pages_exact()
    - set state to error if backend didn't unmap (Roger Pau Monné)
    abf1fd59
xen-blkfront.c 71.2 KB