]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
parisc: Fix IRQ leak in LASI driver
authorHongling Zeng <zenghongling@kylinos.cn>
Sun, 3 May 2026 04:17:44 +0000 (12:17 +0800)
committerHelge Deller <deller@gmx.de>
Mon, 4 May 2026 09:48:12 +0000 (11:48 +0200)
When request_irq() succeeds but gsc_common_setup() fails later,
the IRQ is never released. Fix this by adding proper error handling
with goto labels to ensure resources are released in LIFO order.

Detected by Smatch:
  drivers/parisc/lasi.c:216 lasi_init_chip() warn: 'lasi->gsc_irq.irq'
from request_irq() not released on lines: 207.

Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <error27@gmail.com>
Closes: https://lore.kernel.org/r/202604180957.4QdAIxP6-lkp@intel.com/
Signed-off-by: Hongling Zeng <zenghongling@kylinos.cn>
Cc: stable@vger.kernel.org
Signed-off-by: Helge Deller <deller@gmx.de>
drivers/parisc/lasi.c

index ef6125d838788bb7af3b87065972bc502ff8b27f..a5b80cd5cc37d76fd80dbbf1ac3ed01e98b03f4c 100644 (file)
@@ -193,8 +193,7 @@ static int __init lasi_init_chip(struct parisc_device *dev)
 
        ret = request_irq(lasi->gsc_irq.irq, gsc_asic_intr, 0, "lasi", lasi);
        if (ret < 0) {
-               kfree(lasi);
-               return ret;
+               goto err_free;
        }
 
        /* enable IRQ's for devices below LASI */
@@ -203,8 +202,7 @@ static int __init lasi_init_chip(struct parisc_device *dev)
        /* Done init'ing, register this driver */
        ret = gsc_common_setup(dev, lasi);
        if (ret) {
-               kfree(lasi);
-               return ret;
+               goto err_irq;
        }    
 
        gsc_fixup_irqs(dev, lasi, lasi_choose_irq);
@@ -214,6 +212,12 @@ static int __init lasi_init_chip(struct parisc_device *dev)
                SYS_OFF_PRIO_DEFAULT, lasi_power_off, lasi);
 
        return ret;
+
+err_irq:
+       free_irq(lasi->gsc_irq.irq, lasi);
+err_free:
+       kfree(lasi);
+       return ret;
 }
 
 static struct parisc_device_id lasi_tbl[] __initdata = {