USB: cdc_acm: Fix oops when Droids MuIn LCD is connected
The Droids MuIn LCD operates like a serial remote terminal. Data received are displayed directly on the LCD. This patch fixes the kernel null pointer oops when it is plugged in. Add NO_DATA_INTERFACE quirk to tell the driver that "control" and "data" interfaces are not separated for this device, which prevents dereferencing a null pointer in the device probe code. Signed-off-by: Erik Slagter <erik@slagter.name> Signed-off-by: Maxin B. John <maxin.john@gmail.com> Tested-by: Erik Slagter <erik@slagter.name> Cc: stable <stable@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
a9df304cf7
commit
fd5054c169
@@ -853,7 +853,7 @@ static int acm_probe(struct usb_interface *intf,
|
|||||||
u8 ac_management_function = 0;
|
u8 ac_management_function = 0;
|
||||||
u8 call_management_function = 0;
|
u8 call_management_function = 0;
|
||||||
int call_interface_num = -1;
|
int call_interface_num = -1;
|
||||||
int data_interface_num;
|
int data_interface_num = -1;
|
||||||
unsigned long quirks;
|
unsigned long quirks;
|
||||||
int num_rx_buf;
|
int num_rx_buf;
|
||||||
int i;
|
int i;
|
||||||
@@ -937,6 +937,10 @@ next_desc:
|
|||||||
if (!union_header) {
|
if (!union_header) {
|
||||||
if (call_interface_num > 0) {
|
if (call_interface_num > 0) {
|
||||||
dev_dbg(&intf->dev, "No union descriptor, using call management descriptor\n");
|
dev_dbg(&intf->dev, "No union descriptor, using call management descriptor\n");
|
||||||
|
/* quirks for Droids MuIn LCD */
|
||||||
|
if (quirks & NO_DATA_INTERFACE)
|
||||||
|
data_interface = usb_ifnum_to_if(usb_dev, 0);
|
||||||
|
else
|
||||||
data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = call_interface_num));
|
data_interface = usb_ifnum_to_if(usb_dev, (data_interface_num = call_interface_num));
|
||||||
control_interface = intf;
|
control_interface = intf;
|
||||||
} else {
|
} else {
|
||||||
@@ -1535,6 +1539,11 @@ static const struct usb_device_id acm_ids[] = {
|
|||||||
.driver_info = NOT_A_MODEM,
|
.driver_info = NOT_A_MODEM,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/* Support for Droids MuIn LCD */
|
||||||
|
{ USB_DEVICE(0x04d8, 0x000b),
|
||||||
|
.driver_info = NO_DATA_INTERFACE,
|
||||||
|
},
|
||||||
|
|
||||||
/* control interfaces without any protocol set */
|
/* control interfaces without any protocol set */
|
||||||
{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
|
{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
|
||||||
USB_CDC_PROTO_NONE) },
|
USB_CDC_PROTO_NONE) },
|
||||||
|
@@ -126,3 +126,4 @@ struct acm {
|
|||||||
#define SINGLE_RX_URB 2
|
#define SINGLE_RX_URB 2
|
||||||
#define NO_CAP_LINE 4
|
#define NO_CAP_LINE 4
|
||||||
#define NOT_A_MODEM 8
|
#define NOT_A_MODEM 8
|
||||||
|
#define NO_DATA_INTERFACE 16
|
||||||
|
Reference in New Issue
Block a user