Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c4c00d8e authored by Mike Lockwood's avatar Mike Lockwood
Browse files

libusbhost: Limit bulk transfer requests to 16384 bytes



Otherwise the kernel will return an EINVAL error

Change-Id: I906472a4128eb26c5be7865142bc4a52464cf5f8
Bug: 4065217

Signed-off-by: default avatarMike Lockwood <lockwood@android.com>
parent 5db0897c
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -53,6 +53,9 @@
#define USB_FS_ID_SCANNER   "/dev/bus/usb/%d/%d"
#define USB_FS_ID_FORMAT    "/dev/bus/usb/%03d/%03d"

// From drivers/usb/core/devio.c
// I don't know why this isn't in a kernel header
#define MAX_USBFS_BUFFER_SIZE   16384

struct usb_host_context {
    int fd;
@@ -477,6 +480,10 @@ int usb_device_bulk_transfer(struct usb_device *device,
{
    struct usbdevfs_bulktransfer  ctrl;

    // need to limit request size to avoid EINVAL
    if (length > MAX_USBFS_BUFFER_SIZE)
        length = MAX_USBFS_BUFFER_SIZE;

    memset(&ctrl, 0, sizeof(ctrl));
    ctrl.ep = endpoint;
    ctrl.len = length;
@@ -531,6 +538,10 @@ int usb_request_queue(struct usb_request *req)

    urb->status = -1;
    urb->buffer = req->buffer;
    // need to limit request size to avoid EINVAL
    if (req->buffer_length > MAX_USBFS_BUFFER_SIZE)
        urb->buffer_length = MAX_USBFS_BUFFER_SIZE;
    else
        urb->buffer_length = req->buffer_length;

    do {