| From a506abc7b644d71966a75337d5a534f531b3cdc4 Mon Sep 17 00:00:00 2001 |
| From: Al Viro <viro@zeniv.linux.org.uk> |
| Date: Tue, 27 Apr 2021 12:34:04 -0400 |
| Subject: copy_page_to_iter(): fix ITER_DISCARD case |
| |
| From: Al Viro <viro@zeniv.linux.org.uk> |
| |
| commit a506abc7b644d71966a75337d5a534f531b3cdc4 upstream. |
| |
| we need to advance the iterator... |
| |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| lib/iov_iter.c | 7 +++++-- |
| 1 file changed, 5 insertions(+), 2 deletions(-) |
| |
| --- a/lib/iov_iter.c |
| +++ b/lib/iov_iter.c |
| @@ -922,9 +922,12 @@ size_t copy_page_to_iter(struct page *pa |
| size_t wanted = copy_to_iter(kaddr + offset, bytes, i); |
| kunmap_atomic(kaddr); |
| return wanted; |
| - } else if (unlikely(iov_iter_is_discard(i))) |
| + } else if (unlikely(iov_iter_is_discard(i))) { |
| + if (unlikely(i->count < bytes)) |
| + bytes = i->count; |
| + i->count -= bytes; |
| return bytes; |
| - else if (likely(!iov_iter_is_pipe(i))) |
| + } else if (likely(!iov_iter_is_pipe(i))) |
| return copy_page_to_iter_iovec(page, offset, bytes, i); |
| else |
| return copy_page_to_iter_pipe(page, offset, bytes, i); |