• C
    xprtrdma: Fix a NULL dereference in frwr_unmap_sync() · 9e895cd9
    Chuck Lever 提交于
    The normal mechanism that invalidates and unmaps MRs is
    frwr_unmap_async(). frwr_unmap_sync() is used only when an RPC
    Reply bearing Write or Reply chunks has been lost (ie, almost
    never).
    
    Coverity found that after commit 9a301caf ("xprtrdma: Move
    fr_linv_done field to struct rpcrdma_mr"), the while() loop in
    frwr_unmap_sync() exits only once @mr is NULL, unconditionally
    causing subsequent dereferences of @mr to Oops.
    
    I've tested this fix by creating a client that skips invoking
    frwr_unmap_async() when RPC Replies complete. That forces all
    invalidation tasks to fall upon frwr_unmap_sync(). Simple workloads
    with this fix applied to the adulterated client work as designed.
    Reported-by: Ncoverity-bot <keescook+coverity-bot@chromium.org>
    Addresses-Coverity-ID: 1504556 ("Null pointer dereferences")
    Fixes: 9a301caf ("xprtrdma: Move fr_linv_done field to struct rpcrdma_mr")
    Signed-off-by: NChuck Lever <chuck.lever@oracle.com>
    Signed-off-by: NTrond Myklebust <trond.myklebust@hammerspace.com>
    9e895cd9
frwr_ops.c 18.2 KB