Greg KH <g...@kroah.com> writes:

> On Fri, Aug 17, 2012 at 08:07:11PM +0200, Sven Schnelle wrote:
>> If a device specifies zero endpoints in its interface descriptor,
>> the kernel oops's with the following output:
>> 
>> Aug 17 19:32:37 deprecated kernel: [  103.785466] cdc_acm 
>> 1-5:1.0:usb_probe_interface
>> Aug 17 19:32:37 deprecated kernel: [  103.785474] cdc_acm 
>> 1-5:1.0:usb_probe_interface - got id
>> Aug 17 19:32:37 deprecated kernel: [  103.785480] cdc_acm 1-5:1.0:This 
>> device cannot do calls on its own. It is not a modem.
>> Aug 17 19:32:37 deprecated kernel: [  103.785491] BUG: unable to
>> handle kernel NULL pointer dereference at 00000004
>> [..]
>> diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
>> index 56d6bf6..cfffb3d 100644
>> --- a/drivers/usb/class/cdc-acm.c
>> +++ b/drivers/usb/class/cdc-acm.c
>> @@ -1111,6 +1111,8 @@ skip_normal_probe:
>>      epread = &data_interface->cur_altsetting->endpoint[0].desc;
>>      epwrite = &data_interface->cur_altsetting->endpoint[1].desc;
>>  
>> +    if (!epctrl || !epread || !epwrite)
>> +            return -EINVAL;
>
> How about we check the number of endpoints _before_ dereferencing them?
>
> That would seem to be the correct fix here, instead of relying on the
> fact that those arrays are NULL at the moment.

Sorry, my fault. Something like this?:

Author: Sven Schnelle <sv...@stackframe.org>
Date:   Fri Aug 17 19:54:34 2012 +0200

    CDC ACM: Fix NULL pointer dereference
    
    If a device specifies zero endpoints in its interface descriptor,
    the kernel oopses in acm_probe(). Even though that's clearly an
    invalid descriptor, we should test wether we have all endpoints.
    This is especially bad as this oops can be triggered by just
    plugging a USB device in.
    
    Signed-off-by: Sven Schnelle <sv...@stackframe.org>

diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
index 56d6bf6..f763ed7 100644
--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -1104,7 +1104,8 @@ skip_normal_probe:
        }
 
 
-       if (data_interface->cur_altsetting->desc.bNumEndpoints < 2)
+       if (data_interface->cur_altsetting->desc.bNumEndpoints < 2 ||
+           control_interface->cur_altsetting->desc.bNumEndpoints == 0)
                return -EINVAL;
 
        epctrl = &control_interface->cur_altsetting->endpoint[0].desc;

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to