(Sorry for the duplicate- I should know better than to try
sending patches from Outlook... This should fix the word
wrapping.)

This patch cleans up a few arbitrary limits in usbfs:

1. The data stage of a control request was being limited
   to 4096-8 bytes, when in actuality a 4096-byte data stage
   is legal. This is necessary to write userspace drivers
   for some devices, such as ATI's USB TV-Wonder tuner.

2. The arbitrary limit on Isochronous packets was too small
   to support writing userspace drivers for USB 2.0 devices
   that require high-bandwidth isochronous transfers.

3. Isochronous transfers had a higher arbitrary buffer size
   limit than bulk/interrupt transfers. Isochronous transfers
   now use MAX_USBFS_BUFFER_SIZE, which has been raised to 32K.
   These limits are in place not to enforce the USB spec, but
   to prevent userspace applications from abusing kmalloc().
   We might as well allow all transfers access to the higher
   32K limit, since it was already possible for a malicious
   userspace app to allocate 32K at a time using isochronous
   URBs.

Signed-off-by: Micah Dowty <micah <at> vmware.com>

--- .pc/usbfs-limits/drivers/usb/core/devio.c   2005-01-19 14:57:04.000000000 
-0800
+++ drivers/usb/core/devio.c    2005-01-19 15:10:04.000000000 -0800
@@ -83,7 +83,7 @@
 #define USB_DEVICE_DEV         MKDEV(USB_DEVICE_MAJOR, 0)


-#define        MAX_USBFS_BUFFER_SIZE   16384
+#define        MAX_USBFS_BUFFER_SIZE   32768

 static inline int connected (struct usb_device *dev)
 {
@@ -928,8 +928,8 @@
                if ((ep->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
                                != USB_ENDPOINT_XFER_CONTROL)
                        return -EINVAL;
-               /* min 8 byte setup packet, max arbitrary */
-               if (uurb->buffer_length < 8 || uurb->buffer_length > PAGE_SIZE)
+               /* min 8 byte setup packet, max 8 byte setup plus 4K data */
+               if (uurb->buffer_length < 8 || uurb->buffer_length > (4096 + 8))
                        return -EINVAL;
                if (!(dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL)))
                        return -ENOMEM;
@@ -987,13 +987,14 @@
                        return -EFAULT;
                }
                for (totlen = u = 0; u < uurb->number_of_packets; u++) {
-                       if (isopkt[u].length > 1023) {
+                       /* arbitrary limit, sufficient for USB 2.0 
high-bandwidth iso */
+                       if (isopkt[u].length > 8192) {
                                kfree(isopkt);
                                return -EINVAL;
                        }
                        totlen += isopkt[u].length;
                }
-               if (totlen > 32768) {
+               if (totlen > MAX_USBFS_BUFFER_SIZE) {
                        kfree(isopkt);
                        return -EINVAL;
                }


-------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to