Commit 37b0dc5e authored by Hongling Zeng's avatar Hongling Zeng Committed by Helge Deller
Browse files

parisc: Fix IRQ leak in LASI driver



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: default avatarkernel test robot <lkp@intel.com>
Reported-by: default avatarDan Carpenter <error27@gmail.com>
Closes: https://lore.kernel.org/r/202604180957.4QdAIxP6-lkp@intel.com/


Signed-off-by: default avatarHongling Zeng <zenghongling@kylinos.cn>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarHelge Deller <deller@gmx.de>
parent 41ca998f
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -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 = {