From 992e03e0bd87801c35f5c6d8855396fc481387b8 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Sun, 22 May 2022 19:34:45 -0600 Subject: [PATCH 1/4] iov: add iter_is_user() Returns true if the iter is holding user memory. Use that for the might_fault() checks. Signed-off-by: Jens Axboe --- include/linux/uio.h | 5 +++++ lib/iov_iter.c | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/include/linux/uio.h b/include/linux/uio.h index 52baa3c89505..d10c19a650a8 100644 --- a/include/linux/uio.h +++ b/include/linux/uio.h @@ -112,6 +112,11 @@ static inline unsigned char iov_iter_rw(const struct iov_iter *i) return i->data_source ? WRITE : READ; } +static inline bool iter_is_user(const struct iov_iter *i) +{ + return iter_is_iovec(i) || iter_is_ubuf(i); +} + /* * Total number of bytes covered by an iovec. * diff --git a/lib/iov_iter.c b/lib/iov_iter.c index 08296769f5c6..aa41394174eb 100644 --- a/lib/iov_iter.c +++ b/lib/iov_iter.c @@ -767,7 +767,7 @@ size_t _copy_to_iter(const void *addr, size_t bytes, struct iov_iter *i) { if (unlikely(iov_iter_is_pipe(i))) return copy_pipe_to_iter(addr, bytes, i); - if (iter_is_iovec(i) || iter_is_ubuf(i)) + if (iter_is_user(i)) might_fault(); iterate_and_advance(i, bytes, base, len, off, copyout(base, addr + off, len), @@ -849,7 +849,7 @@ size_t _copy_mc_to_iter(const void *addr, size_t bytes, struct iov_iter *i) { if (unlikely(iov_iter_is_pipe(i))) return copy_mc_pipe_to_iter(addr, bytes, i); - if (iter_is_iovec(i) || iter_is_ubuf(i)) + if (iter_is_user(i)) might_fault(); __iterate_and_advance(i, bytes, base, len, off, copyout_mc(base, addr + off, len), @@ -867,7 +867,7 @@ size_t _copy_from_iter(void *addr, size_t bytes, struct iov_iter *i) WARN_ON(1); return 0; } - if (iter_is_iovec(i) || iter_is_ubuf(i)) + if (iter_is_user(i)) might_fault(); iterate_and_advance(i, bytes, base, len, off, copyin(addr + off, base, len), -- 2.35.1