Commit 0619aaa34c0c for kernel

commit 0619aaa34c0c2a2dcb07f0e9c8a34e7efb8c4cdf
Author: Yousef Alhouseen <alhouseenyousef@gmail.com>
Date:   Wed Jun 24 15:02:02 2026 -0700

    vhost/vdpa: reject overflowing PA map page counts on 32-bit

    vhost_vdpa_pa_map() adds the IOVA page offset to the user-controlled map
    size before computing the number of pages to pin. On 32-bit systems,
    where unsigned long is narrower than u64, that addition can overflow and
    the code can pin and map fewer pages than the requested IOTLB range.

    Reject sizes that overflow the unsigned long page-count calculation.

    Fixes: 22af48cf91aa ("vdpa: factor out vhost_vdpa_pa_map() and vhost_vdpa_pa_unmap()")
    Acked-by: Michael S. Tsirkin <mst@redhat.com>
    Signed-off-by: Yousef Alhouseen <alhouseenyousef@gmail.com>
    Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
    Message-ID: <CAMuQ4bX-iDvcUOPPY+NLz95tkRJYwWqvzAr=U48uNaub_HZLGw@mail.gmail.com>

diff --git a/drivers/vhost/vdpa.c b/drivers/vhost/vdpa.c
index ef642bc9f97e..c3d913bd7cac 100644
--- a/drivers/vhost/vdpa.c
+++ b/drivers/vhost/vdpa.c
@@ -1109,6 +1109,7 @@ static int vhost_vdpa_pa_map(struct vhost_vdpa *v,
 	unsigned int gup_flags = FOLL_LONGTERM;
 	unsigned long npages, cur_base, map_pfn, last_pfn = 0;
 	unsigned long lock_limit, sz2pin, nchunks, i;
+	unsigned long page_offset;
 	u64 start = iova;
 	long pinned;
 	int ret = 0;
@@ -1121,7 +1122,13 @@ static int vhost_vdpa_pa_map(struct vhost_vdpa *v,
 	if (perm & VHOST_ACCESS_WO)
 		gup_flags |= FOLL_WRITE;

-	npages = PFN_UP(size + (iova & ~PAGE_MASK));
+	page_offset = iova & ~PAGE_MASK;
+	if (size > ULONG_MAX - page_offset) {
+		ret = -EINVAL;
+		goto free;
+	}
+
+	npages = PFN_UP(size + page_offset);
 	if (!npages) {
 		ret = -EINVAL;
 		goto free;