• Alan Stern's avatar
    USB: core: Fix incorrect pipe calculation in do_proc_control() · b0863f19
    Alan Stern authored
    When the user submits a control URB via usbfs, the user supplies the
    bRequestType value and the kernel uses it to compute the pipe value.
    However, do_proc_control() performs this computation incorrectly in
    the case where the bRequestType direction bit is set to USB_DIR_IN and
    the URB's transfer length is 0: The pipe's direction is also set to IN
    but it should be OUT, which is the direction the actual transfer will
    use regardless of bRequestType.
    
    Commit 5cc59c41 ("USB: core: WARN if pipe direction != setup
    packet direction") added a check to compare the direction bit in the
    pipe value to a control URB's actual direction and to WARN if they are
    different.  This can be triggered by the incorrect computation
    mentioned above, as found by syzbot.
    
    This patch fixes the computation, thus avoiding the WARNing.
    
    Reported-and-tested-by: syzbot+72af3105289dcb4c055b@syzkaller.appspotmail.com
    Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
    Link: https://lore.kernel.org/r/20210712185436.GB326369@rowland.harvard.eduSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    b0863f19
devio.c 68.5 KB