mirror of
https://github.com/torvalds/linux.git
synced 2026-11-06 21:58:01 +01:00
io_uring/net: keep recv buffer select length within MAX_RW_COUNT
Since commitdcbd1c0548("io_uring/net: let io_recv_buf_select return the length of the buffer region"), io_recv_buf_select() returns the selected length as an int. For a non-bundle recv with sqe->len == 0 the length comes from the ring provided buffer, which can be up to 4G, so a buffer of 2G or more makes io_recv() fail the request with a bogus negative result (e.g. -2147483648) instead of receiving into it. Clamp the length to MAX_RW_COUNT, which import_ubuf() limits the transfer to anyway. Fixes:dcbd1c0548("io_uring/net: let io_recv_buf_select return the length of the buffer region") Cc: stable@vger.kernel.org Signed-off-by: Tamaki Yanagawa <ty@000ty.net> Assisted-by: Claude:claude-opus-5-5 Link: https://patch.msgid.link/20261018042227.1105-1-ty@000ty.net Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
98787d3fa4
commit
96262cfab5
|
|
@ -1197,6 +1197,8 @@ static int io_recv_buf_select(struct io_kiocb *req, struct io_async_msghdr *kmsg
|
|||
*sel = io_buffer_select(req, &len, sr->buf_group, issue_flags);
|
||||
if (!sel->addr)
|
||||
return -ENOBUFS;
|
||||
/* ring provided buffers can be up to 4G, keep len an int */
|
||||
len = min_t(size_t, len, MAX_RW_COUNT);
|
||||
sr->buf = sel->addr;
|
||||
sr->len = len;
|
||||
map_ubuf:
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user