In the Linux kernel, the following vulnerability has been resolved:
smc91x: fix broken irq-context in PREEMPT_RT
When smc91x.c is built with PREEMPTRT, the following splat occurs in FVPRevC:
[ 13.055000] smc91x LNRO0003:00 eth0: link up, 10Mbps, half-duplex, lpa 0x0000 [ 13.062137] BUG: workqueue leaked atomic, lock or RCU: kworker/2:1[106] [ 13.062137] preempt=0x00000000 lock=0->0 RCU=0->1 workfn=mldifcwork [ 13.062266] C * replaying previous printk message * [ 13.062266] CPU: 2 UID: 0 PID: 106 Comm: kworker/2:1 Not tainted 6.18.0-dirty #179 PREEMPT{RT,(full)} [ 13.062353] Hardware name: , BIOS [ 13.062382] Workqueue: mld mldifcwork [ 13.062469] Call trace: [ 13.062494] showstack+0x24/0x40 (C) [ 13.062602] _dumpstack+0x28/0x48 [ 13.062710] dumpstacklvl+0x7c/0xb0 [ 13.062818] dumpstack+0x18/0x34 [ 13.062926] processscheduledworks+0x294/0x450 [ 13.063043] workerthread+0x260/0x3d8 [ 13.063124] kthread+0x1c4/0x228 [ 13.063235] retfromfork+0x10/0x20
This happens because smcspecialtrylock() disables IRQs even on PREEMPTRT, but smcspecialunlock() does not restore IRQs on PREEMPTRT. The reason is that smcspecialunlock() calls spinunlockirqrestore(), and rcureadunlockbh() in _devqueuexmit() cannot invoke rcureadunlock() through _localbhenableip() when current->softirqdisablecnt becomes zero.
To address this issue, replace smcspecialtrylock() with spintrylockirqsave().
{
"osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2025/71xxx/CVE-2025-71132.json",
"cna_assigner": "Linux"
}