Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
fork

Configure Feed

Select the types of activity you want to include in your feed.

genirq: Unlock irq descriptor after errors

In irq_set_irqchip_state(), the irq descriptor is not unlocked after an
error is encountered. While that should never happen in practice, a buggy
driver may trigger it. This would result in a lockup, so fix it.

Fixes: 1d0326f352bb ("genirq: Check irq_data_get_irq_chip() return value before use")
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20200811180012.80269-1-linux@roeck-us.net

authored by

Guenter Roeck and committed by
Thomas Gleixner
f107cee9 e27b1636

+5 -2
+5 -2
kernel/irq/manage.c
··· 2731 2732 do { 2733 chip = irq_data_get_irq_chip(data); 2734 - if (WARN_ON_ONCE(!chip)) 2735 - return -ENODEV; 2736 if (chip->irq_set_irqchip_state) 2737 break; 2738 #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY ··· 2747 if (data) 2748 err = chip->irq_set_irqchip_state(data, which, val); 2749 2750 irq_put_desc_busunlock(desc, flags); 2751 return err; 2752 }
··· 2731 2732 do { 2733 chip = irq_data_get_irq_chip(data); 2734 + if (WARN_ON_ONCE(!chip)) { 2735 + err = -ENODEV; 2736 + goto out_unlock; 2737 + } 2738 if (chip->irq_set_irqchip_state) 2739 break; 2740 #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY ··· 2745 if (data) 2746 err = chip->irq_set_irqchip_state(data, which, val); 2747 2748 + out_unlock: 2749 irq_put_desc_busunlock(desc, flags); 2750 return err; 2751 }