usb: clamp bInterval to allowed range
authorFelipe Balbi <balbi@ti.com>
Tue, 2 Jul 2013 07:50:15 +0000 (10:50 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 25 Jul 2013 18:49:30 +0000 (11:49 -0700)
bInterval must be within the range 1 - 16
when running at High/Super speed, and within
the range 1 - 255 when running at Full/Low speed.

In order to catch drivers passing a too
large bInterval on Super/High speed scenarios
(thus overflowing urb->interval), let's clamp()
the argument to the allowed ranges.

Signed-off-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
include/linux/usb.h

index e99b2a114af4589612aa568e4b39a57201eabfaf..eb4252a0da7ec593e35e781cd80176d33a1e444d 100644 (file)
@@ -1547,10 +1547,16 @@ static inline void usb_fill_int_urb(struct urb *urb,
        urb->transfer_buffer_length = buffer_length;
        urb->complete = complete_fn;
        urb->context = context;
-       if (dev->speed == USB_SPEED_HIGH || dev->speed == USB_SPEED_SUPER)
+
+       if (dev->speed == USB_SPEED_HIGH || dev->speed == USB_SPEED_SUPER) {
+               /* make sure interval is within allowed range */
+               interval = clamp(interval, 1, 16);
+
                urb->interval = 1 << (interval - 1);
-       else
+       } else {
                urb->interval = interval;
+       }
+
        urb->start_frame = -1;
 }