FAILED: patch "[PATCH] iommu/amd: Remove latent out-of-bounds access in IOMMU" failed to apply to 6.18-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 6.18-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.18.y
git checkout FETCH_HEAD
git cherry-pick -x 8dfd3d8d74435344ee8dc9237596959c8b2a6cbe
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026052055-satirical-mousy-05cf@gregkh' --subject-prefix 'PATCH 6.18.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 8dfd3d8d74435344ee8dc9237596959c8b2a6cbe Mon Sep 17 00:00:00 2001
From: Eder Zulian <[email protected]>
Date: Fri, 10 Apr 2026 14:55:50 +0200
Subject: [PATCH] iommu/amd: Remove latent out-of-bounds access in IOMMU
debugfs
In iommu_mmio_write() and iommu_capability_write(), the variables dbg_mmio_offset and dbg_cap_offset are declared as int. However, they are populated using kstrtou32_from_user(). If a user provides a sufficiently large value, it can become a negative integer.
Prior to this patch, the AMD IOMMU debugfs implementation was already protected by different mechanisms.
1. #define OFS_IN_SZ 8 ensures the user string <= 8 bytes, so e.g. 0xffffffff isn't a valid input.
if (cnt > OFS_IN_SZ)
return -EINVAL;
2. Implicit type promotion in iommu_mmio_write(), dbg_mmio_offset is int and iommu->mmio_phys_end is u64
if (dbg_mmio_offset > iommu->mmio_phys_end - sizeof(u64))
return -EINVAL;
3. The show handlers would currently catch the negative number and refuse to perform the read.
Replace kstrtou32_from_user() with kstrtos32_from_user() to parse the input, and check for negative values to explicitly prevent out-of-bounds memory accesses directly in iommu_mmio_write() and iommu_capability_write().
drivers/iommu/amd/debugfs.c +5 -4
@@ -31,11 +31,12 @@ static ssize_t iommu_mmio_write(struct file *filp, const char __user *ubuf,if (cnt >OFS_IN_SZ )return -EINVAL ; - ret =kstrtou32_from_user (ubuf, cnt,0 , &dbg_mmio_offset); + ret =kstrtos32_from_user (ubuf, cnt,0 , &dbg_mmio_offset);if (ret)return ret; -if (dbg_mmio_offset > iommu->mmio_phys_end -sizeof (u64)) +if (dbg_mmio_offset <0 || dbg_mmio_offset > + iommu->mmio_phys_end -sizeof (u64))return -EINVAL ; iommu->dbg_mmio_offset = dbg_mmio_offset;
@@ -71,12 +72,12 @@ static ssize_t iommu_capability_write(struct file *filp, const char __user *ubufif (cnt >OFS_IN_SZ )return -EINVAL ; - ret =kstrtou32_from_user (ubuf, cnt,0 , &dbg_cap_offset); + ret =kstrtos32_from_user (ubuf, cnt,0 , &dbg_cap_offset);if (ret)return ret;/* Capability register at offset 0x14 is the last IOMMU capability register. */ -if (dbg_cap_offset >0x14 ) +if (dbg_cap_offset <0 || dbg_cap_offset >0x14 )return -EINVAL ; iommu->dbg_cap_offset = dbg_cap_offset;
PATCH 1/1 iommu/amd: Remove latent out-of-bounds access in IOMMU debugfs
In iommu_mmio_write() and iommu_capability_write(), iommu->dbg_mmio_offset and iommu->dbg_cap_offset are int. However, they are populated using kstrtou32_from_user(). If a user provides a sufficiently large value, it can become a negative integer.
Prior to this patch, the AMD IOMMU debugfs implementation was already protected by different mechanisms.
1. #define OFS_IN_SZ 8 ensures the user string <= 8 bytes, so e.g. 0xffffffff isn't a valid input.
if (cnt > OFS_IN_SZ)
return -EINVAL;
2. Implicit type promotion in iommu_mmio_write(), iommu->dbg_mmio_offset is int and iommu->mmio_phys_end is u64
if (iommu->dbg_mmio_offset > iommu->mmio_phys_end - sizeof(u64))
return -EINVAL;
3. The show handlers would currently catch the negative number and refuse to perform the read.
Replace kstrtou32_from_user() with kstrtos32_from_user() to parse the input, and check for negative values to explicitly prevent out-of-bounds memory accesses directly in iommu_mmio_write() and iommu_capability_write().
--- drivers/iommu/amd/debugfs.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/iommu/amd/debugfs.c +5 -4
@@ -33,11 +33,12 @@ static ssize_t iommu_mmio_write(struct file *filp, const char __user *ubuf,if (cnt >OFS_IN_SZ )return -EINVAL ; - ret =kstrtou32_from_user (ubuf, cnt,0 , &iommu->dbg_mmio_offset); + ret =kstrtos32_from_user (ubuf, cnt,0 , &iommu->dbg_mmio_offset);if (ret)return ret; -if (iommu->dbg_mmio_offset > iommu->mmio_phys_end -sizeof (u64)) { +if (iommu->dbg_mmio_offset <0 || iommu->dbg_mmio_offset > + iommu->mmio_phys_end -sizeof (u64)) { iommu->dbg_mmio_offset =-1 ;return -EINVAL ; }
@@ -74,12 +75,12 @@ static ssize_t iommu_capability_write(struct file *filp, const char __user *ubufif (cnt >OFS_IN_SZ )return -EINVAL ; - ret =kstrtou32_from_user (ubuf, cnt,0 , &iommu->dbg_cap_offset); + ret =kstrtos32_from_user (ubuf, cnt,0 , &iommu->dbg_cap_offset);if (ret)return ret;/* Capability register at offset 0x14 is the last IOMMU capability register. */ -if (iommu->dbg_cap_offset >0x14 ) { +if (iommu->dbg_cap_offset <0 || iommu->dbg_cap_offset >0x14 ) { iommu->dbg_cap_offset =-1 ;return -EINVAL ; }
Signature · 1 line
2.54.0