Re: [PATCH v2] block: Fix start and length check added to iov_iter_extract_bvecs()
From: Keith Busch
Date: Wed Aug 26 2026 - 16:52:33 EST
On Wed, Aug 26, 2026 at 09:46:32PM +0100, David Howells wrote:
> Fixes: 14b007e17881 ("block: validate user space vectors during extraction")
> Suggested-by: Keith Busch <kbusch@xxxxxxxxxx>
Thanks, looks good.
Reviewed-by: Keith Busch <kbusch@xxxxxxxxxx>
Missing your Signed-off-by?
> cc: Keith Busch <kbusch@xxxxxxxxxx>
> cc: Jens Axboe <axboe@xxxxxxxxx>
> cc: Hannes Reinecke <hare@xxxxxxxxxx>
> cc: Christoph Hellwig <hch@xxxxxx>
> cc: Alexander Viro <viro@xxxxxxxxxxxxxxxxxx>
> cc: Paulo Alcantara <pc@xxxxxxxxxxxxx>
> cc: netfs@xxxxxxxxxxxxxxx
> cc: linux-block@xxxxxxxxxxxxxxx
> cc: linux-fsdevel@xxxxxxxxxxxxxxx
> ---
> lib/iov_iter.c | 11 +++++++++--
> 1 file changed, 9 insertions(+), 2 deletions(-)
>
> diff --git a/lib/iov_iter.c b/lib/iov_iter.c
> index 6665372ecf71..c489569a5815 100644
> --- a/lib/iov_iter.c
> +++ b/lib/iov_iter.c
> @@ -1921,15 +1921,22 @@ ssize_t iov_iter_extract_bvecs(struct iov_iter *iter, struct bio_vec *bv,
> unsigned short max_vecs, unsigned mem_align_mask,
> iov_iter_extraction_t extraction_flags)
> {
> - unsigned long start = (unsigned long)iter_iov_addr(iter);
> unsigned short entries_left = max_vecs - *nr_vecs;
> unsigned short nr_pages, i = 0;
> size_t left, offset, len;
> struct page **pages;
> ssize_t size;
>
> - if ((start | iter_iov_len(iter)) & mem_align_mask)
> + if (likely(iter_is_ubuf(iter) ||
> + iter_is_iovec(iter) ||
> + iov_iter_is_kvec(iter))) {
> + unsigned long start = (unsigned long)iter_iov_addr(iter);
> +
> + if ((start | iter_iov_len(iter)) & mem_align_mask)
> + return -EINVAL;
> + } else if (iov_iter_alignment(iter) & mem_align_mask) {
> return -EINVAL;
> + }
>
> /*
> * Move page array up in the allocated memory for the bio vecs as far as
>