HIGH Introduced in 4.17
qla2xxx AbortWork Race
CVE-2026-89860
CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
KernelScan AI6.9MEDIUM
01Description
In the Linux kernel, the following vulnerability has been resolved: scsi: qla2xxx: Initialize NVMe abort_work once at submission qla_nvme_fcp_abort() and qla_nvme_ls_abort() ran INIT_WORK() on priv->abort_work immediately before schedule_work(). INIT_WORK() reinitializes the work_struct, resetting its list head and clearing the pending bit. If an abort is issued more than once for the same command (for example, concurrent transport teardown and a timeout-driven abort), the second INIT_WORK() reinitializes a work item that is already queued, which can corrupt the workqueue list and lead to crashes or a looping worker. Initialize priv->abort_work once at command submission, next to the existing per-command spin_lock_init(&priv->cmd_lock), and leave only schedule_work() in the abort paths. schedule_work() already does nothing when the work item is still pending, so a repeated abort no longer disturbs an in-flight work item. The command is not returned to the transport until the final kref_put()/release callback runs after abort_work has completed, so the work item is idle before priv is reused and the single submission-time INIT_WORK() is safe.
02KernelScan AI Analysis
Risk summary
A race condition in the QLogic qla2xxx FC-NVMe driver can corrupt the kernel workqueue when two concurrent abort requests target the same NVMe command. This can crash the kernel or cause a looping worker thread, and the underlying memory corruption may be exploitable for arbitrary read/write. The bug requires a system with a QLogic Fibre Channel adapter running NVMe workloads and is triggered locally by users with access to the NVMe storage.
Vulnerability analysis
When two abort requests overlap for the same FC-NVMe command—such as a transport teardown racing a timeout-driven abort—the second request reinitializes a background work item that is already queued. Reinitializing an active queued item corrupts the kernel's internal worker list, which can crash the system or cause a worker thread to loop forever. The fix sets up the work item once when the NVMe command is first submitted, so abort paths only schedule it afterward; if the item is still pending, the scheduling call safely does nothing. The command is not returned to the transport until all abort processing has finished, so the work item is idle before its memory is reused. This vulnerability is reachable locally by any user who can issue NVMe I/O through a QLogic Fibre Channel adapter and trigger concurrent command aborts; no special privileges beyond device access are required.
Lifecycle
03Fix Versions
| Branch | Introduced | Fixed in | Patch commit |
|---|---|---|---|
| 6.6 | 4.17 | 6.6.157 | b403700ac62f |
| 6.12 | 4.17 | 6.12.110 | 6a1b50c4879c |
| 6.18 | 4.17 | 6.18.51 | 67f0d5187c29 |
| mainline | 4.17 | 7.3-rc1 | 7e85f6dbc856 |
| 7.2 | 4.17 | 7.2.5 | f4aaa4a4e6f1 |
| cip/6.12 | 4.17 | 6.12.111-cip32 | 6a1b50c4879c |