parisc: Fix IRQ leak in LASI driver

commit 37b0dc5e279f35036fb638d1e187197b6c05a76d upstream.

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Ulrich Hecht <uli@kernel.org>
This commit is contained in:
Hongling Zeng
2026-05-03 12:17:44 +08:00
committed by Ulrich Hecht
parent 01ed2c82fa
commit 6a8585e238

View File

@ -200,8 +200,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 */
@ -210,8 +209,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);
@ -224,6 +222,12 @@ static int __init lasi_init_chip(struct parisc_device *dev)
chassis_power_off = lasi_power_off;
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 = {