• Alan Stern's avatar
    USB: Gadget: core: Help prevent panic during UVC unconfigure · 65dadb2b
    Alan Stern authored
    
    
    Avichal Rakesh reported a kernel panic that occurred when the UVC
    gadget driver was removed from a gadget's configuration.  The panic
    involves a somewhat complicated interaction between the kernel driver
    and a userspace component (as described in the Link tag below), but
    the analysis did make one thing clear: The Gadget core should
    accomodate gadget drivers calling usb_gadget_deactivate() as part of
    their unbind procedure.
    
    Currently this doesn't work.  gadget_unbind_driver() calls
    driver->unbind() while holding the udc->connect_lock mutex, and
    usb_gadget_deactivate() attempts to acquire that mutex, which will
    result in a deadlock.
    
    The simple fix is for gadget_unbind_driver() to release the mutex when
    invoking the ->unbind() callback.  There is no particular reason for
    it to be holding the mutex at that time, and the mutex isn't held
    while the ->bind() callback is invoked.  So we'll drop the mutex
    before performing the unbind callback and reacquire it afterward.
    
    We'll also add a couple of comments to usb_gadget_activate() and
    usb_gadget_deactivate().  Because they run in process context they
    must not be called from a gadget driver's ->disconnect() callback,
    which (according to the kerneldoc for struct usb_gadget_driver in
    include/linux/usb/gadget.h) may run in interrupt context.  This may
    help prevent similar bugs from arising in the future.
    Reported-and-tested-by: default avatarAvichal Rakesh <arakesh@google.com>
    Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
    Fixes: 286d9975 ("usb: gadget: udc: core: Prevent soft_connect_store() race")
    Link: https://lore.kernel.org/linux-usb/4d7aa3f4-22d9-9f5a-3d70-1bd7148ff4ba@google.com/
    Cc: Badhri Jagan Sridharan <badhri@google.com>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/48b2f1f1-0639-46bf-bbfc-98cb05a24914@rowland.harvard.edu
    
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    65dadb2b
core.c 52.7 KB