• Hans de Goede's avatar
    USB: devio: Revert "USB: devio: Don't corrupt user memory" · 746b302c
    Hans de Goede authored
    BugLink: http://bugs.launchpad.net/bugs/1729107
    
    commit 845d584f upstream.
    
    Taking the uurb->buffer_length userspace passes in as a maximum for the
    actual urbs transfer_buffer_length causes 2 serious issues:
    
    1) It breaks isochronous support for all userspace apps using libusb,
       as existing libusb versions pass in 0 for uurb->buffer_length,
       relying on the kernel using the lenghts of the usbdevfs_iso_packet_desc
       descriptors passed in added together as buffer length.
    
       This for example causes redirection of USB audio and Webcam's into
       virtual machines using qemu-kvm to no longer work. This is a userspace
       ABI break and as such must be reverted.
    
       Note that the original commit does not protect other users / the
       kernels memory, it only stops the userspace process making the call
       from shooting itself in the foot.
    
    2) It may cause the kernel to program host controllers to DMA over random
       memory. Just as the devio code used to only look at the iso_packet_desc
       lenghts, the host drivers do the same, relying on the submitter of the
       urbs to make sure the entire buffer is large enough and not checking
       transfer_buffer_length.
    
       But the "USB: devio: Don't corrupt user memory" commit now takes the
       userspace provided uurb->buffer_length for the buffer-size while copying
       over the user-provided iso_packet_desc lengths 1:1, allowing the user
       to specify a small buffer size while programming the host controller to
       dma a lot more data.
    
       (Atleast the ohci, uhci, xhci and fhci drivers do not check
        transfer_buffer_length for isoc transfers.)
    
    This reverts commit fa1ed74e ("USB: devio: Don't corrupt user memory")
    fixing both these issues.
    
    Cc: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
    Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    746b302c
devio.c 59.7 KB