From: Josh Law <objecting@objecting.org>
To: Andrew Morton <akpm@linux-foundation.org>,
Alexander Viro <viro@zeniv.linux.org.uk>
Cc: linux-kernel@vger.kernel.org, linux-block@vger.kernel.org,
linux-fsdevel@vger.kernel.org, Josh Law <objecting@objecting.org>
Subject: [PATCH 6/7] lib/iov_iter: guard iov_iter_alignment() against zero-count iovec/bvec iterators
Date: Fri, 13 Mar 2026 18:10:37 +0000 [thread overview]
Message-ID: <20260313181038.30018-7-objecting@objecting.org> (raw)
In-Reply-To: <20260313181038.30018-1-objecting@objecting.org>
When a direct I/O path calls iov_iter_alignment() on an iterator that
has already been fully consumed (count == 0) — which can occur when the
block layer re-checks alignment after draining all bytes — the
iov_iter_alignment_iovec() and iov_iter_alignment_bvec() helpers enter
their do-while loops unconditionally. With count == 0 and a non-zero
first segment length, the subtraction size -= len wraps the unsigned
size_t to a large value, causing the loop to walk off the end of the
iov/bvec array and read garbage memory.
The ubuf path already guards against this (checking if (size) before
accessing the buffer), but the iovec and bvec paths do not.
Found by reviewing the function for consistent handling of edge cases
across all iterator types, noting the ubuf path's explicit zero check
had no equivalent in the other branches.
Add count == 0 guards in iov_iter_alignment() before calling into the
iovec and bvec helpers, matching the ubuf path's behavior.
Signed-off-by: Josh Law <objecting@objecting.org>
---
lib/iov_iter.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/iov_iter.c b/lib/iov_iter.c
index 18561108aa3a..a5bb4fbd9d38 100644
--- a/lib/iov_iter.c
+++ b/lib/iov_iter.c
@@ -853,10 +853,10 @@ unsigned long iov_iter_alignment(const struct iov_iter *i)
/* iovec and kvec have identical layouts */
if (likely(iter_is_iovec(i) || iov_iter_is_kvec(i)))
- return iov_iter_alignment_iovec(i);
+ return i->count ? iov_iter_alignment_iovec(i) : 0;
if (iov_iter_is_bvec(i))
- return iov_iter_alignment_bvec(i);
+ return i->count ? iov_iter_alignment_bvec(i) : 0;
/* With both xarray and folioq types, we're dealing with whole folios. */
if (iov_iter_is_folioq(i))
--
2.34.1
next prev parent reply other threads:[~2026-03-13 18:11 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-13 18:10 [PATCH 0/7] lib/iov_iter: fix bugs found via cross-function consistency review Josh Law
2026-03-13 18:10 ` [PATCH 1/7] lib/iov_iter: fix missing allocation failure check in iov_iter_extract_bvec_pages() Josh Law
2026-03-13 18:16 ` Caleb Sander Mateos
2026-03-13 18:20 ` Josh Law
2026-03-13 18:22 ` Caleb Sander Mateos
2026-03-13 18:10 ` [PATCH 2/7] lib/iov_iter: add NULL check on folioq->prev in iov_iter_folioq_revert() Josh Law
2026-03-13 18:10 ` [PATCH 3/7] lib/iov_iter: fix misplaced parenthesis in iov_iter_restore() kvec check Josh Law
2026-03-23 12:39 ` Christian Brauner
2026-03-23 15:16 ` Josh Law
2026-03-13 18:10 ` [PATCH 4/7] lib/iov_iter: account for iov_offset in iov_iter_single_seg_count() folioq path Josh Law
2026-03-13 18:10 ` [PATCH 5/7] lib/iov_iter: account for iov_offset in iov_iter_gap_alignment() Josh Law
2026-03-13 18:10 ` Josh Law [this message]
2026-03-13 18:10 ` [PATCH 7/7] lib/iov_iter: add missing should_fail_usercopy() in copy_to_user_iter_mc() Josh Law
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260313181038.30018-7-objecting@objecting.org \
--to=objecting@objecting.org \
--cc=akpm@linux-foundation.org \
--cc=linux-block@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox