• Jack Pham's avatar
    usb: gadget: f_fs: Process all descriptors during bind · 7a67ec75
    Jack Pham authored
    commit 6cf439e0 upstream.
    
    During _ffs_func_bind(), the received descriptors are evaluated
    to prepare for binding with the gadget in order to allocate
    endpoints and optionally set up OS descriptors. However, the
    high- and super-speed descriptors are only parsed based on
    whether the gadget_is_dualspeed() and gadget_is_superspeed()
    calls are true, respectively.
    
    This is a problem in case a userspace program always provides
    all of the {full,high,super,OS} descriptors when configuring a
    function. Then, for example if a gadget device is not capable
    of SuperSpeed, the call to ffs_do_descs() for the SS descriptors
    is skipped, resulting in an incorrect offset calculation for
    the vla_ptr when moving on to the OS descriptors that follow.
    This causes ffs_do_os_descs() to fail as it is now looking at
    the SS descriptors' offset within the raw_descs buffer instead.
    
    _ffs_func_bind() should evaluate the descriptors unconditionally,
    so remove the checks for gadget speed.
    
    Fixes: f0175ab5 ("usb: gadget: f_fs: OS descriptors support")
    Cc: stable@vger.kernel.org
    Co-Developed-by: default avatarMayank Rana <mrana@codeaurora.org>
    Signed-off-by: default avatarMayank Rana <mrana@codeaurora.org>
    Signed-off-by: default avatarJack Pham <jackp@codeaurora.org>
    Signed-off-by: default avatarFelipe Balbi <felipe.balbi@linux.intel.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    7a67ec75
f_fs.c 79.9 KB