Input: gtco - fix crash on detecting device without endpoints

The gtco driver expects at least one valid endpoint. If given malicious
descriptors that specify 0 for the number of endpoints, it will crash in
the probe function. Ensure there is at least one endpoint on the interface
before using it.

Also let's fix a minor coding style issue.

The full correct report of this issue can be found in the public
Red Hat Bugzilla:

https://bugzilla.redhat.com/show_bug.cgi?id=1283385

Reported-by: Ralf Spenneberg <ralf@spenneberg.net>
Signed-off-by: Vladis Dronov <vdronov@redhat.com>
Cc: stable@vger.kernel.org
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
Vladis Dronov 2016-03-31 10:53:42 -07:00 committed by Dmitry Torokhov
parent d314e9e80c
commit 162f98dea4
1 changed files with 9 additions and 1 deletions

View File

@ -858,6 +858,14 @@ static int gtco_probe(struct usb_interface *usbinterface,
goto err_free_buf; goto err_free_buf;
} }
/* Sanity check that a device has an endpoint */
if (usbinterface->altsetting[0].desc.bNumEndpoints < 1) {
dev_err(&usbinterface->dev,
"Invalid number of endpoints\n");
error = -EINVAL;
goto err_free_urb;
}
/* /*
* The endpoint is always altsetting 0, we know this since we know * The endpoint is always altsetting 0, we know this since we know
* this device only has one interrupt endpoint * this device only has one interrupt endpoint
@ -879,7 +887,7 @@ static int gtco_probe(struct usb_interface *usbinterface,
* HID report descriptor * HID report descriptor
*/ */
if (usb_get_extra_descriptor(usbinterface->cur_altsetting, if (usb_get_extra_descriptor(usbinterface->cur_altsetting,
HID_DEVICE_TYPE, &hid_desc) != 0){ HID_DEVICE_TYPE, &hid_desc) != 0) {
dev_err(&usbinterface->dev, dev_err(&usbinterface->dev,
"Can't retrieve exta USB descriptor to get hid report descriptor length\n"); "Can't retrieve exta USB descriptor to get hid report descriptor length\n");
error = -EIO; error = -EIO;