aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVladis Dronov <vdronov@redhat.com>2015-11-16 12:55:11 -0500
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2015-11-19 08:36:02 -0500
commitfa52bd506f274b7619955917abfde355e3d19ffe (patch)
tree1110302c66e4c2482eaaff93cf91fd6d38550985
parent1efc21701d94ed0c5b91467b042bed8b8becd5cc (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.c16
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);