Patch "USB: cdc-acm: handle broken union descriptors" has been added to the 5.8-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

    USB: cdc-acm: handle broken union descriptors

to the 5.8-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:
     usb-cdc-acm-handle-broken-union-descriptors.patch
and it can be found in the queue-5.8 subdirectory.

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



commit 35a8acf48453f46bf5b28a602f3fb56eb7bf5aeb
Author: Johan Hovold <johan@xxxxxxxxxx>
Date:   Mon Sep 21 15:59:49 2020 +0200

    USB: cdc-acm: handle broken union descriptors
    
    [ Upstream commit 960c7339de27c6d6fec13b54880501c3576bb08d ]
    
    Handle broken union functional descriptors where the master-interface
    doesn't exist or where its class is of neither Communication or Data
    type (as required by the specification) by falling back to
    "combined-interface" probing.
    
    Note that this still allows for handling union descriptors with switched
    interfaces.
    
    This specifically makes the Whistler radio scanners TRX series devices
    work with the driver without adding further quirks to the device-id
    table.
    
    Reported-by: Daniel Caujolle-Bert <f1rmb.daniel@xxxxxxxxx>
    Tested-by: Daniel Caujolle-Bert <f1rmb.daniel@xxxxxxxxx>
    Acked-by: Oliver Neukum <oneukum@xxxxxxxx>
    Signed-off-by: Johan Hovold <johan@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20200921135951.24045-3-johan@xxxxxxxxxx
    Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
index 7499ba118665a..c02488d469185 100644
--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -1243,9 +1243,21 @@ static int acm_probe(struct usb_interface *intf,
 			}
 		}
 	} else {
+		int class = -1;
+
 		data_intf_num = union_header->bSlaveInterface0;
 		control_interface = usb_ifnum_to_if(usb_dev, union_header->bMasterInterface0);
 		data_interface = usb_ifnum_to_if(usb_dev, data_intf_num);
+
+		if (control_interface)
+			class = control_interface->cur_altsetting->desc.bInterfaceClass;
+
+		if (class != USB_CLASS_COMM && class != USB_CLASS_CDC_DATA) {
+			dev_dbg(&intf->dev, "Broken union descriptor, assuming single interface\n");
+			combined_interfaces = 1;
+			control_interface = data_interface = intf;
+			goto look_for_collapsed_interface;
+		}
 	}
 
 	if (!control_interface || !data_interface) {



[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