From: sashiko-bot@kernel.org
To: "Krzysztof Karas" <krzysztof.karas@intel.com>
Cc: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org
Subject: Re: [PATCH v5 3/6] iommu/dma: Catch scatterlist length overflows
Date: Mon, 17 Aug 2026 10:11:10 +0000 [thread overview]
Message-ID: <20260817101110.799001F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260817095648.2438192-4-krzysztof.karas@intel.com>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
Pre-existing issues:
- [High] Error path `out_restore_sg` corrupts unprocessed elements of reused scatterlists.
- [High] Accumulator `iova_len` silently overflows on 32-bit systems for mappings exceeding 4GB.
--
--- Patch [3]: [PATCH v5 3/6] iommu/dma: Catch scatterlist length overflows ---
commit 955c8f50877d1e47058e0056fd63e5f20f4d62b9
Author: Krzysztof Karas <krzysztof.karas@intel.com>
Subject: iommu/dma: Catch scatterlist length overflows
This commit introduces overflow detection for scatterlist length fields to
prevent silent wrapping when very large mappings use only one scatterlist.
It adds check_add_overflow() and overflows_type() checks to
iommu_dma_map_sg(), failing early if limits are exceeded.
> diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c
> index 9a07eb39336eb..61cb64bcbd3cc 100644
> --- a/drivers/iommu/dma-iommu.c
> +++ b/drivers/iommu/dma-iommu.c
[ ... ]
> @@ -1476,7 +1478,22 @@ int iommu_dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
> sg_dma_address(s) = s_iova_off;
> sg_dma_len(s) = s_length;
> s->offset -= s_iova_off;
> - s_length = iova_align(iovad, s_length + s_iova_off);
> +
> + if (check_add_overflow(s_length, s_iova_off, &s_length_tmp)) {
> + ret = -EOVERFLOW;
> + goto out_restore_sg;
> + }
[Severity: High]
This isn't a bug introduced by this patch, but these newly added early return
paths make it much more likely to trigger a pre-existing issue in
__invalidate_sg().
If a driver reuses a scatterlist without calling sg_init_table(), and the
subsequent mapping fails here during element iteration, __invalidate_sg() will
loop over all elements rather than just the processed ones.
For unvisited elements, sg_dma_address(s) retains the stale IOVA from a
previous mapping. __invalidate_sg() erroneously adds this stale IOVA to
s->offset:
drivers/iommu/dma-iommu.c:__invalidate_sg() {
...
if (sg_dma_address(s) != DMA_MAPPING_ERROR)
s->offset += sg_dma_address(s);
...
}
Will this corrupted offset lead to wild physical address calculations in
sg_phys() upon retry or buffer access, resulting in arbitrary DMA memory
corruption?
[ ... ]
> @@ -1493,7 +1510,18 @@ int iommu_dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
> * time through here (i.e. before it has a meaningful value).
> */
> if (pad_len && pad_len < s_length - 1) {
> - prev->length += pad_len;
> + unsigned int new_prev_len;
> + /*
> + * For large mappings spanning multiple GBs we
> + * may not be able to fit all needed padding into
> + * sg->length.
> + */
> + if (check_add_overflow(prev->length, pad_len, &new_prev_len)) {
> + ret = -EOVERFLOW;
> + goto out_restore_sg;
> + }
> +
> + prev->length = new_prev_len;
> iova_len += pad_len;
[Severity: High]
This is a pre-existing issue, but since the patch addresses scatterlist length
overflows, could iova_len silently overflow here on 32-bit systems for
mappings exceeding 4GB?
If the size_t iova_len accumulator wraps around when adding pad_len or
s_length, it would lead to an undersized IOVA allocation. iommu_map_sg()
would then map the full physical memory range, overrunning the allocated IOVA
space and corrupting IOMMU page tables.
Should there be overflow checks for iova_len accumulation as well?
> }
>
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260817095648.2438192-1-krzysztof.karas@intel.com?part=3
next prev parent reply other threads:[~2026-08-17 10:11 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-17 9:56 [PATCH v5 0/6] drivers: Improve memory management for large object allocations when i915/shmem is used with iommu Krzysztof Karas
2026-08-17 9:56 ` [PATCH v5 1/6] drm/i915/gem: Count mapped pages in a folio Krzysztof Karas
2026-08-17 9:56 ` [PATCH 2/6] drm/i915/gem: Free sg table on failure to acquire second folio Krzysztof Karas
2026-08-17 9:56 ` [PATCH v5 3/6] iommu/dma: Catch scatterlist length overflows Krzysztof Karas
2026-08-17 10:11 ` sashiko-bot [this message]
2026-08-17 9:56 ` [PATCH v5 4/6] drm/i915/gem: Pull out size validation into a separate function Krzysztof Karas
2026-08-17 9:56 ` [PATCH v5 5/6] drm/i915/gem: Read and shrink memory in " Krzysztof Karas
2026-08-17 9:56 ` [PATCH v5 6/6] drm/i915/gem: Remove iterator and use while loop Krzysztof Karas
2026-08-17 15:01 ` ✓ i915.CI.BAT: success for drivers: Improve memory management for large object allocations when i915/shmem is used with iommu Patchwork
2026-08-18 3:30 ` ✓ i915.CI.Full: " Patchwork
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=20260817101110.799001F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=intel-gfx@lists.freedesktop.org \
--cc=krzysztof.karas@intel.com \
--cc=sashiko-reviews@lists.linux.dev \
/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