• Gabriel Krisman Bertazi's avatar
    io_uring: Require zeroed sqe->len on provided-buffers send · 79996b45
    Gabriel Krisman Bertazi authored
    When sending from a provided buffer, we set sr->len to be the smallest
    between the actual buffer size and sqe->len.  But, now that we
    disconnect the buffer from the submission request, we can get in a
    situation where the buffers and requests mismatch, and only part of a
    buffer gets sent.  Assume:
    
    * buf[1]->len = 128; buf[2]->len = 256
    * sqe[1]->len = 128; sqe[2]->len = 256
    
    If sqe1 runs first, it picks buff[1] and it's all good. But, if sqe[2]
    runs first, sqe[1] picks buff[2], and the last half of buff[2] is
    never sent.
    
    While arguably the use-case of different-length sends is questionable,
    it has already raised confusion with potential users of this
    feature. Let's make the interface less tricky by forcing the length to
    only come from the buffer ring entry itself.
    
    Fixes: ac5f71a3 ("io_uring/net: add provided buffer support for IORING_OP_SEND")
    Signed-off-by: default avatarGabriel Krisman Bertazi <krisman@suse.de>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    79996b45
net.c 42.4 KB