VYPR
Unrated severityNVD Advisory· Published May 28, 2026

CVE-2026-46105

CVE-2026-46105

Description

In the Linux kernel, the following vulnerability has been resolved:

scsi: mpt3sas: Limit NVMe request size to 2 MiB

The HBA firmware reports NVMe MDTS values based on the underlying drive capability. However, because the driver allocates a fixed 4K buffer for the PRP list, accommodating at most 512 entries, the driver supports a maximum I/O transfer size of 2 MiB.

Limit max_hw_sectors to the smaller of the reported MDTS and the 2 MiB driver limit to prevent issuing oversized I/O that may lead to a kernel oops.

Affected products

2

Patches

6
04631f55afc5

scsi: mpt3sas: Limit NVMe request size to 2 MiB

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitRanjan KumarApr 14, 2026Fixed in 7.1-rc3via kernel-cna
1 file changed · +13 2
  • drivers/scsi/mpt3sas/mpt3sas_scsih.c+13 2 modified
    diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
    index 6ff78855729424..12caffeed3a0d2 100644
    --- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
    +++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
    @@ -2738,8 +2738,20 @@ scsih_sdev_configure(struct scsi_device *sdev, struct queue_limits *lim)
     				pcie_device->enclosure_level,
     				pcie_device->connector_name);
     
    +		/*
    +		 * The HBA firmware passes the NVMe drive's MDTS
    +		 * (Maximum Data Transfer Size) up to the driver. However,
    +		 * the driver hardcodes a 4K buffer size for the PRP list,
    +		 * accommodating at most 512 entries. This strictly limits
    +		 * the maximum supported NVMe I/O transfer to 2 MiB.
    +		 *
    +		 * Cap max_hw_sectors to the smaller of the drive's reported
    +		 * MDTS or the 2 MiB driver limit to prevent kernel oopses.
    +		 */
    +		lim->max_hw_sectors = SZ_2M >> SECTOR_SHIFT;
     		if (pcie_device->nvme_mdts)
    -			lim->max_hw_sectors = pcie_device->nvme_mdts / 512;
    +			lim->max_hw_sectors = min(lim->max_hw_sectors,
    +					pcie_device->nvme_mdts >> SECTOR_SHIFT);
     
     		pcie_device_put(pcie_device);
     		spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
    -- 
    cgit 1.3-korg
    
    
    
45dcc815fc55

scsi: mpt3sas: Limit NVMe request size to 2 MiB

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitRanjan KumarApr 14, 2026Fixed in 6.18.30via kernel-cna
1 file changed · +13 2
  • drivers/scsi/mpt3sas/mpt3sas_scsih.c+13 2 modified
    diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
    index 7092d0debef39a..43ae997242182e 100644
    --- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
    +++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
    @@ -2681,8 +2681,20 @@ scsih_sdev_configure(struct scsi_device *sdev, struct queue_limits *lim)
     				pcie_device->enclosure_level,
     				pcie_device->connector_name);
     
    +		/*
    +		 * The HBA firmware passes the NVMe drive's MDTS
    +		 * (Maximum Data Transfer Size) up to the driver. However,
    +		 * the driver hardcodes a 4K buffer size for the PRP list,
    +		 * accommodating at most 512 entries. This strictly limits
    +		 * the maximum supported NVMe I/O transfer to 2 MiB.
    +		 *
    +		 * Cap max_hw_sectors to the smaller of the drive's reported
    +		 * MDTS or the 2 MiB driver limit to prevent kernel oopses.
    +		 */
    +		lim->max_hw_sectors = SZ_2M >> SECTOR_SHIFT;
     		if (pcie_device->nvme_mdts)
    -			lim->max_hw_sectors = pcie_device->nvme_mdts / 512;
    +			lim->max_hw_sectors = min(lim->max_hw_sectors,
    +					pcie_device->nvme_mdts >> SECTOR_SHIFT);
     
     		pcie_device_put(pcie_device);
     		spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
    -- 
    cgit 1.3-korg
    
    
    
e5f9824817c6

scsi: mpt3sas: Limit NVMe request size to 2 MiB

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitRanjan KumarApr 14, 2026Fixed in 7.0.7via kernel-cna
1 file changed · +13 2
  • drivers/scsi/mpt3sas/mpt3sas_scsih.c+13 2 modified
    diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
    index 6ff78855729424..12caffeed3a0d2 100644
    --- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
    +++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
    @@ -2738,8 +2738,20 @@ scsih_sdev_configure(struct scsi_device *sdev, struct queue_limits *lim)
     				pcie_device->enclosure_level,
     				pcie_device->connector_name);
     
    +		/*
    +		 * The HBA firmware passes the NVMe drive's MDTS
    +		 * (Maximum Data Transfer Size) up to the driver. However,
    +		 * the driver hardcodes a 4K buffer size for the PRP list,
    +		 * accommodating at most 512 entries. This strictly limits
    +		 * the maximum supported NVMe I/O transfer to 2 MiB.
    +		 *
    +		 * Cap max_hw_sectors to the smaller of the drive's reported
    +		 * MDTS or the 2 MiB driver limit to prevent kernel oopses.
    +		 */
    +		lim->max_hw_sectors = SZ_2M >> SECTOR_SHIFT;
     		if (pcie_device->nvme_mdts)
    -			lim->max_hw_sectors = pcie_device->nvme_mdts / 512;
    +			lim->max_hw_sectors = min(lim->max_hw_sectors,
    +					pcie_device->nvme_mdts >> SECTOR_SHIFT);
     
     		pcie_device_put(pcie_device);
     		spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
    -- 
    cgit 1.3-korg
    
    
    
04631f55afc5

scsi: mpt3sas: Limit NVMe request size to 2 MiB

1 file changed · +13 2
  • drivers/scsi/mpt3sas/mpt3sas_scsih.c+13 2 modified
    diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
    index 6ff78855729424..12caffeed3a0d2 100644
    --- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
    +++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
    @@ -2738,8 +2738,20 @@ scsih_sdev_configure(struct scsi_device *sdev, struct queue_limits *lim)
     				pcie_device->enclosure_level,
     				pcie_device->connector_name);
     
    +		/*
    +		 * The HBA firmware passes the NVMe drive's MDTS
    +		 * (Maximum Data Transfer Size) up to the driver. However,
    +		 * the driver hardcodes a 4K buffer size for the PRP list,
    +		 * accommodating at most 512 entries. This strictly limits
    +		 * the maximum supported NVMe I/O transfer to 2 MiB.
    +		 *
    +		 * Cap max_hw_sectors to the smaller of the drive's reported
    +		 * MDTS or the 2 MiB driver limit to prevent kernel oopses.
    +		 */
    +		lim->max_hw_sectors = SZ_2M >> SECTOR_SHIFT;
     		if (pcie_device->nvme_mdts)
    -			lim->max_hw_sectors = pcie_device->nvme_mdts / 512;
    +			lim->max_hw_sectors = min(lim->max_hw_sectors,
    +					pcie_device->nvme_mdts >> SECTOR_SHIFT);
     
     		pcie_device_put(pcie_device);
     		spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
    -- 
    cgit 1.3-korg
    
    
    
45dcc815fc55

scsi: mpt3sas: Limit NVMe request size to 2 MiB

1 file changed · +13 2
  • drivers/scsi/mpt3sas/mpt3sas_scsih.c+13 2 modified
    diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
    index 7092d0debef39a..43ae997242182e 100644
    --- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
    +++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
    @@ -2681,8 +2681,20 @@ scsih_sdev_configure(struct scsi_device *sdev, struct queue_limits *lim)
     				pcie_device->enclosure_level,
     				pcie_device->connector_name);
     
    +		/*
    +		 * The HBA firmware passes the NVMe drive's MDTS
    +		 * (Maximum Data Transfer Size) up to the driver. However,
    +		 * the driver hardcodes a 4K buffer size for the PRP list,
    +		 * accommodating at most 512 entries. This strictly limits
    +		 * the maximum supported NVMe I/O transfer to 2 MiB.
    +		 *
    +		 * Cap max_hw_sectors to the smaller of the drive's reported
    +		 * MDTS or the 2 MiB driver limit to prevent kernel oopses.
    +		 */
    +		lim->max_hw_sectors = SZ_2M >> SECTOR_SHIFT;
     		if (pcie_device->nvme_mdts)
    -			lim->max_hw_sectors = pcie_device->nvme_mdts / 512;
    +			lim->max_hw_sectors = min(lim->max_hw_sectors,
    +					pcie_device->nvme_mdts >> SECTOR_SHIFT);
     
     		pcie_device_put(pcie_device);
     		spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
    -- 
    cgit 1.3-korg
    
    
    
e5f9824817c6

scsi: mpt3sas: Limit NVMe request size to 2 MiB

1 file changed · +13 2
  • drivers/scsi/mpt3sas/mpt3sas_scsih.c+13 2 modified
    diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
    index 6ff78855729424..12caffeed3a0d2 100644
    --- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
    +++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
    @@ -2738,8 +2738,20 @@ scsih_sdev_configure(struct scsi_device *sdev, struct queue_limits *lim)
     				pcie_device->enclosure_level,
     				pcie_device->connector_name);
     
    +		/*
    +		 * The HBA firmware passes the NVMe drive's MDTS
    +		 * (Maximum Data Transfer Size) up to the driver. However,
    +		 * the driver hardcodes a 4K buffer size for the PRP list,
    +		 * accommodating at most 512 entries. This strictly limits
    +		 * the maximum supported NVMe I/O transfer to 2 MiB.
    +		 *
    +		 * Cap max_hw_sectors to the smaller of the drive's reported
    +		 * MDTS or the 2 MiB driver limit to prevent kernel oopses.
    +		 */
    +		lim->max_hw_sectors = SZ_2M >> SECTOR_SHIFT;
     		if (pcie_device->nvme_mdts)
    -			lim->max_hw_sectors = pcie_device->nvme_mdts / 512;
    +			lim->max_hw_sectors = min(lim->max_hw_sectors,
    +					pcie_device->nvme_mdts >> SECTOR_SHIFT);
     
     		pcie_device_put(pcie_device);
     		spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
    -- 
    cgit 1.3-korg
    
    
    

Vulnerability mechanics

Root cause

"Missing upper bound on NVMe I/O transfer size allows requests larger than the driver's fixed 4K PRP list buffer can handle, causing a buffer overflow and kernel oops."

Attack vector

An attacker with access to a system using the mpt3sas driver and an NVMe drive whose MDTS exceeds 2 MiB can trigger oversized I/O requests. When the block layer issues an I/O larger than 2 MiB, the driver's fixed 4K PRP list buffer overflows, leading to a kernel oops. The attack requires the ability to initiate large I/O operations (e.g., via direct I/O or filesystem operations) on the affected NVMe device. No special privileges beyond normal storage access are needed.

Affected code

The vulnerability is in the `scsih_sdev_configure` function in `drivers/scsi/mpt3sas/mpt3sas_scsih.c` [patch_id=2898676]. The driver allocates a fixed 4K buffer for the PRP list, which can hold at most 512 entries, limiting NVMe I/O transfers to 2 MiB. The HBA firmware reports the NVMe drive's MDTS (Maximum Data Transfer Size) value, but the driver previously used this value directly without capping it to the 2 MiB hardware limit.

What the fix does

The patch first sets `lim->max_hw_sectors` to `SZ_2M >> SECTOR_SHIFT` (2 MiB in sectors) as a hard upper bound. Then, if the NVMe drive reports an MDTS value, it uses `min()` to select the smaller of the 2 MiB driver limit and the drive's MDTS (converted to sectors). This ensures the driver never issues an I/O request that exceeds the capacity of its 4K PRP list buffer, preventing the buffer overflow that caused the kernel oops [patch_id=2898676].

Preconditions

  • configSystem must have an NVMe drive connected via an mpt3sas HBA
  • configThe NVMe drive's MDTS must be greater than 2 MiB
  • inputAttacker must be able to initiate large I/O operations on the affected device

Generated on May 28, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

3

News mentions

0

No linked articles in our index yet.