• X
    io_uring: fix possible race condition against REQ_F_NEED_CLEANUP · 00eaddd4
    Xiaoguang Wang 提交于
    to #28736503
    
    commit 6f2cc1664db20676069cff27a461ccc97dbfd114 upstream
    
    In io_read() or io_write(), when io request is submitted successfully,
    it'll go through the below sequence:
    
        kfree(iovec);
        req->flags &= ~REQ_F_NEED_CLEANUP;
        return ret;
    
    But clearing REQ_F_NEED_CLEANUP might be unsafe. The io request may
    already have been completed, and then io_complete_rw_iopoll()
    and io_complete_rw() will be called, both of which will also modify
    req->flags if needed. This causes a race condition, with concurrent
    non-atomic modification of req->flags.
    
    To eliminate this race, in io_read() or io_write(), if io request is
    submitted successfully, we don't remove REQ_F_NEED_CLEANUP flag. If
    REQ_F_NEED_CLEANUP is set, we'll leave __io_req_aux_free() to the
    iovec cleanup work correspondingly.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: NXiaoguang Wang <xiaoguang.wang@linux.alibaba.com>
    Signed-off-by: NJens Axboe <axboe@kernel.dk>
    Acked-by: NJoseph Qi <joseph.qi@linux.alibaba.com>
    00eaddd4
io_uring.c 192.8 KB