]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
can: m_can: Release irq on error in m_can_open
authorSimon Horman <horms@kernel.org>
Mon, 5 Aug 2024 14:01:58 +0000 (15:01 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 12 Sep 2024 09:11:31 +0000 (11:11 +0200)
[ Upstream commit 06d4ef3056a7ac31be331281bb7a6302ef5a7f8a ]

It appears that the irq requested in m_can_open() may be leaked
if an error subsequently occurs: if m_can_start() fails.

Address this by calling free_irq in the unwind path for
such cases.

Flagged by Smatch.
Compile tested only.

Fixes: eaacfeaca7ad ("can: m_can: Call the RAM init directly from m_can_chip_config")
Acked-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Simon Horman <horms@kernel.org>
Link: https://lore.kernel.org/all/20240805-mcan-irq-v2-1-7154c0484819@kernel.org
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/can/m_can/m_can.c

index 2395b1225cc8a72aae923b1e2c6ec98046d6a7f5..fb77fd74de27fb54835e76245b890786cc43102d 100644 (file)
@@ -1871,7 +1871,7 @@ static int m_can_open(struct net_device *dev)
        /* start the m_can controller */
        err = m_can_start(dev);
        if (err)
-               goto exit_irq_fail;
+               goto exit_start_fail;
 
        if (!cdev->is_peripheral)
                napi_enable(&cdev->napi);
@@ -1880,6 +1880,9 @@ static int m_can_open(struct net_device *dev)
 
        return 0;
 
+exit_start_fail:
+       if (cdev->is_peripheral || dev->irq)
+               free_irq(dev->irq, dev);
 exit_irq_fail:
        if (cdev->is_peripheral)
                destroy_workqueue(cdev->tx_wq);