Re: [PATCH] CDC ACM: Fix NULL pointer dereference

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Greg KH <greg@xxxxxxxxx> 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 <svens@xxxxxxxxxxxxxx>
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 <svens@xxxxxxxxxxxxxx>

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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux