Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

io_uring: ensure symmetry in handling iter types in loop_rw_iter()

When setting up the next segment, we check what type the iter is and
handle it accordingly. However, when incrementing and processed amount
we do not, and both iter advance and addr/len are adjusted, regardless
of type. Split the increment side just like we do on the setup side.

Fixes: 4017eb91a9e7 ("io_uring: make loop_rw_iter() use original user supplied pointers")
Cc: stable@vger.kernel.org
Reported-by: Valentina Palmiotti <vpalmiotti@gmail.com>
Reviewed-by: Pavel Begunkov <asml.silence@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>

+6 -3
+6 -3
fs/io_uring.c
··· 3263 3263 ret = nr; 3264 3264 break; 3265 3265 } 3266 + if (!iov_iter_is_bvec(iter)) { 3267 + iov_iter_advance(iter, nr); 3268 + } else { 3269 + req->rw.len -= nr; 3270 + req->rw.addr += nr; 3271 + } 3266 3272 ret += nr; 3267 3273 if (nr != iovec.iov_len) 3268 3274 break; 3269 - req->rw.len -= nr; 3270 - req->rw.addr += nr; 3271 - iov_iter_advance(iter, nr); 3272 3275 } 3273 3276 3274 3277 return ret;