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

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



commit 32f0e461b8aa2199e3283544bf5229a7e1a144c7
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 2dc563b61b88a..d46f683beccdd 100644
--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -1178,9 +1178,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