Patch "can: m_can: Release irq on error in m_can_open" has been added to the 5.15-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    can: m_can: Release irq on error in m_can_open

to the 5.15-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     can-m_can-release-irq-on-error-in-m_can_open.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit f1b1f8fb3bf33fa5862c9aa7a7ba0c6dc04cca62
Author: Simon Horman <horms@xxxxxxxxxx>
Date:   Mon Aug 5 15:01:58 2024 +0100

    can: m_can: Release irq on error in m_can_open
    
    [ 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@xxxxxxxxxxxxxx>
    Signed-off-by: Simon Horman <horms@xxxxxxxxxx>
    Link: https://lore.kernel.org/all/20240805-mcan-irq-v2-1-7154c0484819@xxxxxxxxxx
    Signed-off-by: Marc Kleine-Budde <mkl@xxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index e027229c1955..07f61ee76ca6 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -1840,7 +1840,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;
 
 	can_led_event(dev, CAN_LED_EVENT_OPEN);
 
@@ -1851,6 +1851,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);




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux