aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Horman <[email protected]>2024-08-05 15:01:58 +0100
committerMarc Kleine-Budde <[email protected]>2024-08-06 09:25:12 +0200
commit06d4ef3056a7ac31be331281bb7a6302ef5a7f8a (patch)
treeec67f37dfe46668a654830328675b6f97ebb050b
parent76fe372ccb81b0c89b6cd2fec26e2f38c958be85 (diff)
can: m_can: Release irq on error in m_can_open
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 <[email protected]> Signed-off-by: Simon Horman <[email protected]> Link: https://lore.kernel.org/all/[email protected] Signed-off-by: Marc Kleine-Budde <[email protected]>
-rw-r--r--drivers/net/can/m_can/m_can.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index 7f63f866083e..cd83c8b5d4b1 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -2052,7 +2052,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);
@@ -2061,6 +2061,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);