io_uring: ensure symmetry in handling iter types in loop_rw_iter()
commit16c8d2df7e
upstream. 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:4017eb91a9
("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> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
88f3d951e2
commit
ce8f81b76d
@ -3206,12 +3206,15 @@ static ssize_t loop_rw_iter(int rw, struct io_kiocb *req, struct iov_iter *iter)
|
|||||||
ret = nr;
|
ret = nr;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (!iov_iter_is_bvec(iter)) {
|
||||||
|
iov_iter_advance(iter, nr);
|
||||||
|
} else {
|
||||||
|
req->rw.len -= nr;
|
||||||
|
req->rw.addr += nr;
|
||||||
|
}
|
||||||
ret += nr;
|
ret += nr;
|
||||||
if (nr != iovec.iov_len)
|
if (nr != iovec.iov_len)
|
||||||
break;
|
break;
|
||||||
req->rw.len -= nr;
|
|
||||||
req->rw.addr += nr;
|
|
||||||
iov_iter_advance(iter, nr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
Reference in New Issue
Block a user