Description
In the Linux kernel, the following vulnerability has been resolved: gpio: eic-sprd: use raw_spinlock_t in the irq startup path sprd_eic_irq_unmask() enables the GPIO IRQ and then updates controller state through sprd_eic_update(), which takes sprd_eic->lock with spin_lock_irqsave(). The callback can be reached from irq_startup() while setting up a requested IRQ. That path is not sleepable, but on PREEMPT_RT a regular spinlock_t becomes a sleeping lock. This issue was found by our static analysis tool and then manually reviewed against the current tree. The grounded PoC kept the request_threaded_irq() -> __setup_irq() -> irq_startup() -> sprd_eic_irq_unmask() -> sprd_eic_update() carrier and used the original spin_lock_irqsave(&sprd_eic->lock) edge. Lockdep BUG: sleeping function called from invalid context hardirqs last disabled at ... __setup_irq.constprop.0 ... [vuln_msv] sprd_rt_spin_lock_irqsave+0x1c/0x30 [vuln_msv] sprd_eic_update.constprop.0+0x48/0x90 [vuln_msv] sprd_eic_irq_unmask.constprop.0+0x35/0x50 [vuln_msv] __setup_irq.constprop.0+0xd/0x30 [vuln_msv] Convert the Spreadtrum EIC controller lock to raw_spinlock_t. The locked section only serializes MMIO register updates and does not contain sleepable operations, so keeping it non-sleeping is appropriate for the irqchip callbacks.
Affected products
Version statuses are supplied by the assigning organization. Consult the original record for detailed ranges and platform conditions.
Linux Linux
Default version status: unaffected
25518e024e3a6e5715d672f1daa91e1d100f7436 to < 96612bf2712cd961dbd9b52f3a9b4ab668f57628affected25518e024e3a6e5715d672f1daa91e1d100f7436 to < 581ac2ad001ff1128931191f249a7f2074672b7aaffected25518e024e3a6e5715d672f1daa91e1d100f7436 to < e244cd8b51001ba480f274c44dba9002813a4739affected25518e024e3a6e5715d672f1daa91e1d100f7436 to < 19d63fd528719ce7d06d9aeb88d25b7d6478198aaffected25518e024e3a6e5715d672f1daa91e1d100f7436 to < 6112fba4150039ccd90e29f2d1b788c73ad7b3ddaffected25518e024e3a6e5715d672f1daa91e1d100f7436 to < 4750909a40da9016185e0ac991510a278cecb1e7affected25518e024e3a6e5715d672f1daa91e1d100f7436 to < 5c3c9ec1172a4c3384b8b800b3a8896cc2c1b20eaffected25518e024e3a6e5715d672f1daa91e1d100f7436 to < 90f0109019e6817eb40a486671b7722d1544ae29affected
Linux Linux
Default version status: affected
4.17affected0 to < 4.17unaffected5.10.261 to ≤ 5.10.*unaffected5.15.212 to ≤ 5.15.*unaffected6.1.178 to ≤ 6.1.*unaffected6.6.145 to ≤ 6.6.*unaffected6.12.96 to ≤ 6.12.*unaffected6.18.39 to ≤ 6.18.*unaffected7.1.4 to ≤ 7.1.*unaffected7.2 to ≤ *unaffected
References
- https://git.kernel.org/stable/c/96612bf2712cd961dbd9b52f3a9b4ab668f57628 ↗
- https://git.kernel.org/stable/c/581ac2ad001ff1128931191f249a7f2074672b7a ↗
- https://git.kernel.org/stable/c/e244cd8b51001ba480f274c44dba9002813a4739 ↗
- https://git.kernel.org/stable/c/19d63fd528719ce7d06d9aeb88d25b7d6478198a ↗
- https://git.kernel.org/stable/c/6112fba4150039ccd90e29f2d1b788c73ad7b3dd ↗
- https://git.kernel.org/stable/c/4750909a40da9016185e0ac991510a278cecb1e7 ↗
- https://git.kernel.org/stable/c/5c3c9ec1172a4c3384b8b800b3a8896cc2c1b20e ↗
- https://git.kernel.org/stable/c/90f0109019e6817eb40a486671b7722d1544ae29 ↗