Patch "block: fix sanity checks in blk_rq_map_user_bvec" has been added to the 6.6-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    block: fix sanity checks in blk_rq_map_user_bvec

to the 6.6-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     block-fix-sanity-checks-in-blk_rq_map_user_bvec.patch
and it can be found in the queue-6.6 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit c0f268e3d2262dd28f14dbf293b769f6ae09625f
Author: Xinyu Zhang <xizhang@xxxxxxxxxxxxxxx>
Date:   Wed Oct 23 15:15:19 2024 -0600

    block: fix sanity checks in blk_rq_map_user_bvec
    
    [ Upstream commit 2ff949441802a8d076d9013c7761f63e8ae5a9bd ]
    
    blk_rq_map_user_bvec contains a check bytes + bv->bv_len > nr_iter which
    causes unnecessary failures in NVMe passthrough I/O, reproducible as
    follows:
    
    - register a 2 page, page-aligned buffer against a ring
    - use that buffer to do a 1 page io_uring NVMe passthrough read
    
    The second (i = 1) iteration of the loop in blk_rq_map_user_bvec will
    then have nr_iter == 1 page, bytes == 1 page, bv->bv_len == 1 page, so
    the check bytes + bv->bv_len > nr_iter will succeed, causing the I/O to
    fail. This failure is unnecessary, as when the check succeeds, it means
    we've checked the entire buffer that will be used by the request - i.e.
    blk_rq_map_user_bvec should complete successfully. Therefore, terminate
    the loop early and return successfully when the check bytes + bv->bv_len
    > nr_iter succeeds.
    
    While we're at it, also remove the check that all segments in the bvec
    are single-page. While this seems to be true for all users of the
    function, it doesn't appear to be required anywhere downstream.
    
    CC: stable@xxxxxxxxxxxxxxx
    Signed-off-by: Xinyu Zhang <xizhang@xxxxxxxxxxxxxxx>
    Co-developed-by: Uday Shankar <ushankar@xxxxxxxxxxxxxxx>
    Signed-off-by: Uday Shankar <ushankar@xxxxxxxxxxxxxxx>
    Fixes: 37987547932c ("block: extend functionality to map bvec iterator")
    Link: https://lore.kernel.org/r/20241023211519.4177873-1-ushankar@xxxxxxxxxxxxxxx
    Signed-off-by: Jens Axboe <axboe@xxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/block/blk-map.c b/block/blk-map.c
index 71210cdb34426..0aadbaf7a9ddd 100644
--- a/block/blk-map.c
+++ b/block/blk-map.c
@@ -600,9 +600,7 @@ static int blk_rq_map_user_bvec(struct request *rq, const struct iov_iter *iter)
 		if (nsegs >= nr_segs || bytes > UINT_MAX - bv->bv_len)
 			goto put_bio;
 		if (bytes + bv->bv_len > nr_iter)
-			goto put_bio;
-		if (bv->bv_offset + bv->bv_len > PAGE_SIZE)
-			goto put_bio;
+			break;
 
 		nsegs++;
 		bytes += bv->bv_len;




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux