diff options
author | Vladis Dronov <vdronov@redhat.com> | 2015-11-16 12:55:11 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2015-11-19 08:36:02 -0500 |
commit | fa52bd506f274b7619955917abfde355e3d19ffe (patch) | |
tree | 1110302c66e4c2482eaaff93cf91fd6d38550985 | |
parent | 1efc21701d94ed0c5b91467b042bed8b8becd5cc (diff) |
[media] usbvision: fix crash on detecting device with invalid configuration
The usbvision driver crashes when a specially crafted usb device with invalid
number of interfaces or endpoints is detected. This fix adds checks that the
device has proper configuration expected by the driver.
Reported-by: Ralf Spenneberg <ralf@spenneberg.net>
Signed-off-by: Vladis Dronov <vdronov@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
-rw-r--r-- | drivers/media/usb/usbvision/usbvision-video.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/media/usb/usbvision/usbvision-video.c b/drivers/media/usb/usbvision/usbvision-video.c index 3089d640c82d..de9ff3bb8edd 100644 --- a/drivers/media/usb/usbvision/usbvision-video.c +++ b/drivers/media/usb/usbvision/usbvision-video.c | |||
@@ -1470,9 +1470,23 @@ static int usbvision_probe(struct usb_interface *intf, | |||
1470 | 1470 | ||
1471 | if (usbvision_device_data[model].interface >= 0) | 1471 | if (usbvision_device_data[model].interface >= 0) |
1472 | interface = &dev->actconfig->interface[usbvision_device_data[model].interface]->altsetting[0]; | 1472 | interface = &dev->actconfig->interface[usbvision_device_data[model].interface]->altsetting[0]; |
1473 | else | 1473 | else if (ifnum < dev->actconfig->desc.bNumInterfaces) |
1474 | interface = &dev->actconfig->interface[ifnum]->altsetting[0]; | 1474 | interface = &dev->actconfig->interface[ifnum]->altsetting[0]; |
1475 | else { | ||
1476 | dev_err(&intf->dev, "interface %d is invalid, max is %d\n", | ||
1477 | ifnum, dev->actconfig->desc.bNumInterfaces - 1); | ||
1478 | ret = -ENODEV; | ||
1479 | goto err_usb; | ||
1480 | } | ||
1481 | |||
1482 | if (interface->desc.bNumEndpoints < 2) { | ||
1483 | dev_err(&intf->dev, "interface %d has %d endpoints, but must" | ||
1484 | " have minimum 2\n", ifnum, interface->desc.bNumEndpoints); | ||
1485 | ret = -ENODEV; | ||
1486 | goto err_usb; | ||
1487 | } | ||
1475 | endpoint = &interface->endpoint[1].desc; | 1488 | endpoint = &interface->endpoint[1].desc; |
1489 | |||
1476 | if (!usb_endpoint_xfer_isoc(endpoint)) { | 1490 | if (!usb_endpoint_xfer_isoc(endpoint)) { |
1477 | dev_err(&intf->dev, "%s: interface %d. has non-ISO endpoint!\n", | 1491 | dev_err(&intf->dev, "%s: interface %d. has non-ISO endpoint!\n", |
1478 | __func__, ifnum); | 1492 | __func__, ifnum); |