diff options
author | Simon Horman <[email protected]> | 2024-08-05 15:01:58 +0100 |
---|---|---|
committer | Marc Kleine-Budde <[email protected]> | 2024-08-06 09:25:12 +0200 |
commit | 06d4ef3056a7ac31be331281bb7a6302ef5a7f8a (patch) | |
tree | ec67f37dfe46668a654830328675b6f97ebb050b | |
parent | 76fe372ccb81b0c89b6cd2fec26e2f38c958be85 (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.c | 5 |
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); |