linux-cifs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] iov_iter: Fix iov_iter_get_pages{,_alloc} page fault return value
@ 2021-07-21 21:01 Andreas Gruenbacher
  0 siblings, 0 replies; only message in thread
From: Andreas Gruenbacher @ 2021-07-21 21:01 UTC (permalink / raw)
  To: Alexander Viro, Steve French, Trond Myklebust, Anna Schumaker
  Cc: Andreas Gruenbacher, Linus Torvalds, linux-fsdevel, linux-kernel,
	linux-cifs

Both iov_iter_get_pages and iov_iter_get_pages_alloc return the number of bytes
of the iovec they could get the pages for.  When they cannot get any pages,
they're supposed to return 0, but when the start of the iovec isn't page
aligned, the calculation goes wrong and they return a negative value.
Fix that in both functions.

In addition, change iov_iter_get_pages_alloc to return ZERO_SIZE_PTR in that
case to prevent resource leaks.

It seems that the cifs and nfs filesystems don't handle the zero case very
well.  Steve, Trond, Anna, could you please have a look?

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
---
 lib/iov_iter.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/lib/iov_iter.c b/lib/iov_iter.c
index e23123ae3a13..20dc3d800573 100644
--- a/lib/iov_iter.c
+++ b/lib/iov_iter.c
@@ -1484,7 +1484,7 @@ ssize_t iov_iter_get_pages(struct iov_iter *i,
 		res = get_user_pages_fast(addr, n,
 				iov_iter_rw(i) != WRITE ?  FOLL_WRITE : 0,
 				pages);
-		if (unlikely(res < 0))
+		if (unlikely(res <= 0))
 			return res;
 		return (res == n ? len : res * PAGE_SIZE) - *start;
 	}
@@ -1608,8 +1608,9 @@ ssize_t iov_iter_get_pages_alloc(struct iov_iter *i,
 			return -ENOMEM;
 		res = get_user_pages_fast(addr, n,
 				iov_iter_rw(i) != WRITE ?  FOLL_WRITE : 0, p);
-		if (unlikely(res < 0)) {
+		if (unlikely(res <= 0)) {
 			kvfree(p);
+			*pages = ZERO_SIZE_PTR;
 			return res;
 		}
 		*pages = p;
-- 
2.26.3


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-07-21 21:02 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-07-21 21:01 [PATCH] iov_iter: Fix iov_iter_get_pages{,_alloc} page fault return value Andreas Gruenbacher

This is a public inbox, see mirroring instructions
on how to clone and mirror all data and code used for this inbox