• Jason Gunthorpe's avatar
    RDMA/cma: Execute rdma_cm destruction from a handler properly · f6a9d47a
    Jason Gunthorpe authored
    When a rdma_cm_id needs to be destroyed after a handler callback fails,
    part of the destruction pattern is open coded into each call site.
    
    Unfortunately the blind assignment to state discards important information
    needed to do cma_cancel_operation(). This results in active operations
    being left running after rdma_destroy_id() completes, and the
    use-after-free bugs from KASAN.
    
    Consolidate this entire pattern into destroy_id_handler_unlock() and
    manage the locking correctly. The state should be set to
    RDMA_CM_DESTROYING under the handler_lock to atomically ensure no futher
    handlers are called.
    
    Link: https://lore.kernel.org/r/20200723070707.1771101-5-leon@kernel.org
    Reported-by: syzbot+08092148130652a6faae@syzkaller.appspotmail.com
    Reported-by: syzbot+a929647172775e335941@syzkaller.appspotmail.com
    Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
    Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
    f6a9d47a
cma.c 127 KB