• Cong Wang's avatar
    infiniband: fix a possible use-after-free bug · cb2595c1
    Cong Wang authored
    ucma_process_join() will free the new allocated "mc" struct,
    if there is any error after that, especially the copy_to_user().
    
    But in parallel, ucma_leave_multicast() could find this "mc"
    through idr_find() before ucma_process_join() frees it, since it
    is already published.
    
    So "mc" could be used in ucma_leave_multicast() after it is been
    allocated and freed in ucma_process_join(), since we don't refcnt
    it.
    
    Fix this by separating "publish" from ID allocation, so that we
    can get an ID first and publish it later after copy_to_user().
    
    Fixes: c8f6a362 ("RDMA/cma: Add multicast communication support")
    Reported-by: default avatarNoam Rathaus <noamr@beyondsecurity.com>
    Signed-off-by: default avatarCong Wang <xiyou.wangcong@gmail.com>
    Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
    cb2595c1
ucma.c 44.3 KB