• Alan Stern's avatar
    USB: rio500: Fix lockdep violation · 9472aff1
    Alan Stern authored
    The syzbot fuzzer found a lockdep violation in the rio500 driver:
    
    	======================================================
    	WARNING: possible circular locking dependency detected
    	5.3.0-rc2+ #23 Not tainted
    	------------------------------------------------------
    	syz-executor.2/20386 is trying to acquire lock:
    	00000000772249c6 (rio500_mutex){+.+.}, at: open_rio+0x16/0xc0
    	drivers/usb/misc/rio500.c:64
    
    	but task is already holding lock:
    	00000000d3e8f4b9 (minor_rwsem){++++}, at: usb_open+0x23/0x270
    	drivers/usb/core/file.c:39
    
    	which lock already depends on the new lock.
    
    The problem is that the driver's open_rio() routine is called while
    the usbcore's minor_rwsem is locked for reading, and it acquires the
    rio500_mutex; whereas conversely, probe_rio() and disconnect_rio()
    first acquire the rio500_mutex and then call usb_register_dev() or
    usb_deregister_dev(), which lock minor_rwsem for writing.
    
    The correct ordering of acquisition should be: minor_rwsem first, then
    rio500_mutex (since the locking in open_rio() cannot be changed).
    Thus, the probe and disconnect routines should avoid holding
    rio500_mutex while doing their registration and deregistration.
    
    This patch adjusts the code in those two routines to do just that.  It
    also relies on the fact that the probe and disconnect routines are
    protected by the device mutex, so the initial test of rio->present
    needs no extra locking.
    
    Reported-by: syzbot+7bbcbe9c9ff0cd49592a@syzkaller.appspotmail.com
    Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
    Fixes: d710734b ("USB: rio500: simplify locking")
    Acked-by: default avatarOliver Neukum <oneukum@suse.com>
    CC: <stable@vger.kernel.org>
    
    Link: https://lore.kernel.org/r/Pine.LNX.4.44L0.1908081329240.1319-100000@iolanthe.rowland.orgSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    9472aff1
rio500.c 12.8 KB