]> git.ipfire.org Git - thirdparty/kernel/stable.git/commit
io_uring/rw: check for NULL io_br_sel when putting a buffer
authorJens Axboe <axboe@kernel.dk>
Wed, 15 Oct 2025 19:38:53 +0000 (13:38 -0600)
committerJens Axboe <axboe@kernel.dk>
Wed, 15 Oct 2025 19:38:53 +0000 (13:38 -0600)
commit18d6b1743eafeb3fb1e0ea5a2b7fd0a773d525a8
treec605a6126b040092f035bdf85a8efc85e40663ff
parent437c23357d897f5b5b7d297c477da44b56654d46
io_uring/rw: check for NULL io_br_sel when putting a buffer

Both the read and write side use kiocb_done() to finish a request, and
kiocb_done() will call io_put_kbuf() in case a provided buffer was used
for the request. Provided buffers are not supported for writes, hence
NULL is being passed in. This normally works fine, as io_put_kbuf()
won't actually use the value unless REQ_F_BUFFER_RING or
REQ_F_BUFFER_SELECTED is set in the request flags. But depending on
compiler (or whether or not CONFIG_CC_OPTIMIZE_FOR_SIZE is set), that
may be done even though the value is never used. This will then cause a
NULL pointer dereference.

Make it a bit more obvious and check for a NULL io_br_sel, and don't
even bother calling io_put_kbuf() for that case.

Fixes: 5fda51255439 ("io_uring/kbuf: switch to storing struct io_buffer_list locally")
Reported-by: David Howells <dhowells@redhat.com>
Tested-by: David Howells <dhowells@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/rw.c