diff options
author | Johan Hovold <johan@kernel.org> | 2017-03-13 08:53:55 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-05-25 09:44:39 -0400 |
commit | 736f41a47442c164e3cdc8d2a980d3155130163f (patch) | |
tree | 7ca7774d1dbcef28353008e9b12a262510fa51bb /drivers | |
parent | a3adb4721ae2af534b1adf74dfb7f54329fa448c (diff) |
usbvision: fix NULL-deref at probe
commit eacb975b48272f54532b62f515a3cf7eefa35123 upstream.
Make sure to check the number of endpoints to avoid dereferencing a
NULL-pointer or accessing memory beyond the endpoint array should a
malicious device lack the expected endpoints.
Fixes: 2a9f8b5d25be ("V4L/DVB (5206): Usbvision: set alternate interface
modification")
Cc: Thierry MERLE <thierry.merle@free.fr>
Signed-off-by: Johan Hovold <johan@kernel.org>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/media/usb/usbvision/usbvision-video.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/media/usb/usbvision/usbvision-video.c b/drivers/media/usb/usbvision/usbvision-video.c index c8b4eb2ee7a2..bfdf72355332 100644 --- a/drivers/media/usb/usbvision/usbvision-video.c +++ b/drivers/media/usb/usbvision/usbvision-video.c | |||
@@ -1506,7 +1506,14 @@ static int usbvision_probe(struct usb_interface *intf, | |||
1506 | } | 1506 | } |
1507 | 1507 | ||
1508 | for (i = 0; i < usbvision->num_alt; i++) { | 1508 | for (i = 0; i < usbvision->num_alt; i++) { |
1509 | u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[1].desc. | 1509 | u16 tmp; |
1510 | |||
1511 | if (uif->altsetting[i].desc.bNumEndpoints < 2) { | ||
1512 | ret = -ENODEV; | ||
1513 | goto err_pkt; | ||
1514 | } | ||
1515 | |||
1516 | tmp = le16_to_cpu(uif->altsetting[i].endpoint[1].desc. | ||
1510 | wMaxPacketSize); | 1517 | wMaxPacketSize); |
1511 | usbvision->alt_max_pkt_size[i] = | 1518 | usbvision->alt_max_pkt_size[i] = |
1512 | (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1); | 1519 | (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1); |