• Jens Axboe's avatar
    io_uring/rw: don't attempt to allocate async data if opcode doesn't need it · 0df96fb7
    Jens Axboe authored
    The new read multishot method doesn't need to allocate async data ever,
    as it doesn't do vectored IO and it must only be used with provided
    buffers. While it doesn't have ->prep_async() set, it also sets
    ->async_size to 0, which is different from any other read/write type we
    otherwise support.
    
    If it's used on a file type that isn't pollable, we do try and allocate
    this async data, and then try and use that data. But since we passed in
    a size of 0 for the data, we get a NULL back on data allocation. We then
    proceed to dereference that to copy state, and that obviously won't end
    well.
    
    Add a check in io_setup_async_rw() for this condition, and avoid copying
    state. Also add a check for whether or not buffer selection is specified
    in prep while at it.
    
    Fixes: fc68fcda ("io_uring/rw: add support for IORING_OP_READ_MULTISHOT")
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=218101Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    0df96fb7
rw.c 29 KB