]> git.baikalelectronics.ru Git - kernel.git/commitdiff
can: etas_es58x: es58x_rx_err_msg(): fix memory leak in error path
authorVincent Mailhol <mailhol.vincent@wanadoo.fr>
Tue, 26 Oct 2021 18:07:40 +0000 (03:07 +0900)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Sat, 6 Nov 2021 16:29:40 +0000 (17:29 +0100)
In es58x_rx_err_msg(), if can->do_set_mode() fails, the function
directly returns without calling netif_rx(skb). This means that the
skb previously allocated by alloc_can_err_skb() is not freed. In other
terms, this is a memory leak.

This patch simply removes the return statement in the error branch and
let the function continue.

Issue was found with GCC -fanalyzer, please follow the link below for
details.

Fixes: 3b599fa48e86 ("can: etas_es58x: add core support for ETAS ES58X CAN USB interfaces")
Link: https://lore.kernel.org/all/20211026180740.1953265-1-mailhol.vincent@wanadoo.fr
Signed-off-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/usb/etas_es58x/es58x_core.c

index 96a13c770e4a18d84905fb0386c074d21d8a2a01..24627ab146261703bb9360bd8e01e59e8cd24107 100644 (file)
@@ -664,7 +664,7 @@ int es58x_rx_err_msg(struct net_device *netdev, enum es58x_err error,
        struct can_device_stats *can_stats = &can->can_stats;
        struct can_frame *cf = NULL;
        struct sk_buff *skb;
-       int ret;
+       int ret = 0;
 
        if (!netif_running(netdev)) {
                if (net_ratelimit())
@@ -823,8 +823,6 @@ int es58x_rx_err_msg(struct net_device *netdev, enum es58x_err error,
                        can->state = CAN_STATE_BUS_OFF;
                        can_bus_off(netdev);
                        ret = can->do_set_mode(netdev, CAN_MODE_STOP);
-                       if (ret)
-                               return ret;
                }
                break;
 
@@ -881,7 +879,7 @@ int es58x_rx_err_msg(struct net_device *netdev, enum es58x_err error,
                                        ES58X_EVENT_BUSOFF, timestamp);
        }
 
-       return 0;
+       return ret;
 }
 
 /**