CVE-2026-46290: x86/efi: Fix graceful fault handling after FPU softirq changes
In the Linux kernel, the following vulnerability has been resolved:
x86/efi: Fix graceful fault handling after FPU softirq changes
Since commit d02198550423 ("x86/fpu: Improve crypto performance by making kernel-mode FPU reliably usable in softirqs"), kernelfpubegin() calls fpregslock() which uses localbhdisable() instead of the previous preemptdisable(). This sets SOFTIRQOFFSET in preemptcount during the entire EFI runtime service call, causing ininterrupt() to return true in normal task context.
The graceful page fault handler eficrashgracefullyonpagefault() uses ininterrupt() to bail out for faults in real interrupt context. With SOFTIRQOFFSET now set, the handler always bails out, leaving EFI firmware page faults unhandled. This escalates to die() which also sees ininterrupt() as true and calls panic("Fatal exception in interrupt"), resulting in a hard system freeze. On systems with buggy firmware that triggers page faults during EFI runtime calls (e.g., accessing unmapped memory in GetTime()), this causes an unrecoverable hang instead of the expected graceful EFIABORTED recovery.
Fix by replacing ininterrupt() with !intask(). This preserves the original intent of bailing for interrupts or NMI faults, while no longer falsely triggering from the FPU code path's localbhdisable().
[ardb: Sashiko spotted that using 'inhardirq() || innmi()' leaves a window where a softirq may be taken before fpregslock() is called, but after efirtswork.efirtsid has been assigned, and any page faults occurring in that window will then be misidentified as having been caused by the firmware. Instead, use !intask(), which incorporates inservingsoftirq(). ]
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
x86/efito a version that resolves this vulnerability.Patch Fix graceful fault handling after FPU softirq changes - Configuration
Update the kernel code path so the graceful fault handling logic uses '!in_task()' instead of 'in_interrupt()' (per the statement: "Fix by replacing in_interrupt() with !in_task().").
Linux kernel Replace in_interrupt() with !in_task() in graceful fault handling = !in_task()
Event History
Frequently Asked Questions
What is the severity of CVE-2026-46290?
CVE-2026-46290 has a risk rating of 17, indicating a significant vulnerability that requires prompt attention.
How do I fix CVE-2026-46290?
To fix CVE-2026-46290, update the Linux kernel to the latest version that includes the patch addressing the graceful fault handling after FPU softirq changes.
What systems are affected by CVE-2026-46290?
CVE-2026-46290 affects systems running the Linux kernel with x86/efi architecture.
What are the potential impacts of CVE-2026-46290?
CVE-2026-46290 can lead to unstable system behavior due to improper fault handling in the kernel's FPU softirq management.
When was CVE-2026-46290 published?
CVE-2026-46290 was published on June 8, 2026.