• Jack Pham's avatar
    usb: gadget: f_fs: Use config_ep_by_speed() · 675272d0
    Jack Pham authored
    In commit 2bfa0719 ("usb: gadget: function: f_fs: pass
    companion descriptor along") there is a pointer arithmetic
    bug where the comp_desc is obtained as follows:
    
     comp_desc = (struct usb_ss_ep_comp_descriptor *)(ds +
    	       USB_DT_ENDPOINT_SIZE);
    
    Since ds is a pointer to usb_endpoint_descriptor, adding
    7 to it ends up going out of bounds (7 * sizeof(struct
    usb_endpoint_descriptor), which is actually 7*9 bytes) past
    the SS descriptor. As a result the maxburst value will be
    read incorrectly, and the UDC driver will also get a garbage
    comp_desc (assuming it uses it).
    
    Since Felipe wrote, "Eventually, f_fs.c should be converted
    to use config_ep_by_speed() like all other functions, though",
    let's finally do it. This allows the other usb_ep fields to
    be properly populated, such as maxpacket and mult. It also
    eliminates the awkward speed-based descriptor lookup since
    config_ep_by_speed() does that already using the ones found
    in struct usb_function.
    
    Fixes: 2bfa0719 ("usb: gadget: function: f_fs: pass companion descriptor along")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarJack Pham <jackp@codeaurora.org>
    Signed-off-by: default avatarFelipe Balbi <felipe.balbi@linux.intel.com>
    675272d0
f_fs.c 87.1 KB