CVE-2026-90007
nicheMisindexed free_irq() rollback in Linux kernel pm8001 SCSI driver leaves stale MSI-X handlers
The Linux kernel's pm8001 driver (PMC/Microchip PM8001/PM80xx SAS/SATA HBA controllers) contains an error-handling flaw in pm8001_request_msix(): when request_irq() fails during MSI-X vector registration, the rollback loop frees vectors using the failing index i instead of the already-registered index j. This passes the wrong IRQ/dev_id pair to free_irq(), so earlier successfully registered interrupt handlers are left installed with mismatched vector entries. The bug is only triggered on systems where the pm8001 driver loads on PM8001/PM80xx hardware and the MSI-X request path fails mid-registration, e.g. due to interrupt allocation exhaustion. A local attacker with low privileges could potentially influence IRQ allocation to reach this path, and the leftover handlers can lead to crashes or undefined behavior; the CVSS 7.8 score reflects high confidentiality, integrity and availability impact. No public proof-of-concept exists, the issue is not listed in CISA's KEV, and no exploitation is known.
What to do: Update the kernel to a version that includes the pm8001 rollback-index fix (watch stable-tree backports of the 'scsi: pm8001: Use rollback index when freeing MSI-X vectors' commit, since exact fixed version numbers are not provided in the data). Check whether the driver is in use with 'lsmod | grep pm8001' — systems without PM8001/PM80xx HBA hardware or with the module unloaded are not affected. There is no runtime workaround; standard hardening (restricting local unprivileged access on storage servers) reduces any chance of influencing the IRQ-failure path.
| Linux kernel (scsi/pm8001 driver for PMC/Microchip PM8001/PM80xx SAS HBAs) | — |
Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.
In the Linux kernel, the following vulnerability has been resolved: scsi: pm8001: Use rollback index when freeing MSI-X vectors pm8001_request_msix() unwinds previously registered handlers with free_irq() when request_irq() fails. The rollback loop uses the failing index i for every iteration instead of the already registered vector index j. That passes the wrong IRQ/dev_id pair to free_irq() and leaves the earlier handlers installed. Use j for both pci_irq_vector() and the matching irq_vector entry in the rollback loop.
- Vector
- CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
In the news0 stories
No ingested article mentions this CVE yet.