]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
can: gs_usb: fix use of uninitialized variable, detach device on reception of invalid...
authorMarc Kleine-Budde <mkl@pengutronix.de>
Fri, 10 Dec 2021 09:03:09 +0000 (10:03 +0100)
committerAndrea Righi <andrea.righi@canonical.com>
Fri, 21 Jan 2022 14:49:35 +0000 (15:49 +0100)
BugLink: https://bugs.launchpad.net/bugs/1958418
commit 4a8737ff068724f509d583fef404d349adba80d6 upstream.

The received data contains the channel the received data is associated
with. If the channel number is bigger than the actual number of
channels assume broken or malicious USB device and shut it down.

This fixes the error found by clang:

| drivers/net/can/usb/gs_usb.c:386:6: error: variable 'dev' is used
|                                     uninitialized whenever 'if' condition is true
|         if (hf->channel >= GS_MAX_INTF)
|             ^~~~~~~~~~~~~~~~~~~~~~~~~~
| drivers/net/can/usb/gs_usb.c:474:10: note: uninitialized use occurs here
|                           hf, dev->gs_hf_size, gs_usb_receive_bulk_callback,
|                               ^~~

Link: https://lore.kernel.org/all/20211210091158.408326-1-mkl@pengutronix.de
Fixes: d08e973a77d1 ("can: gs_usb: Added support for the GS_USB CAN devices")
Cc: stable@vger.kernel.org
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Paolo Pisati <p.pisati@gmail.com>
drivers/net/can/usb/gs_usb.c

index 5e892bef46b0067908c444ad8960c63532b0faaa..9a30e5f0c894e3b70d68fb975d331b2fb5fd402f 100644 (file)
@@ -321,7 +321,7 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)
 
        /* device reports out of range channel id */
        if (hf->channel >= GS_MAX_INTF)
-               goto resubmit_urb;
+               goto device_detach;
 
        dev = usbcan->canch[hf->channel];
 
@@ -406,6 +406,7 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)
 
        /* USB failure take down all interfaces */
        if (rc == -ENODEV) {
+ device_detach:
                for (rc = 0; rc < GS_MAX_INTF; rc++) {
                        if (usbcan->canch[rc])
                                netif_device_detach(usbcan->canch[rc]->netdev);