Patch "USB: chaoskey: Fix possible deadlock chaoskey_list_lock" has been added to the 5.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    USB: chaoskey: Fix possible deadlock chaoskey_list_lock

to the 5.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     usb-chaoskey-fix-possible-deadlock-chaoskey_list_loc.patch
and it can be found in the queue-5.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit a9777dd9f357252360e83c5418a92955cd7e8c3d
Author: Edward Adam Davis <eadavis@xxxxxx>
Date:   Wed Oct 9 22:52:07 2024 +0800

    USB: chaoskey: Fix possible deadlock chaoskey_list_lock
    
    [ Upstream commit d73dc7b182be4238b75278bfae16afb4c5564a58 ]
    
    [Syzbot reported two possible deadlocks]
    The first possible deadlock is:
    WARNING: possible recursive locking detected
    6.12.0-rc1-syzkaller-00027-g4a9fe2a8ac53 #0 Not tainted
    --------------------------------------------
    syz-executor363/2651 is trying to acquire lock:
    ffffffff89b120e8 (chaoskey_list_lock){+.+.}-{3:3}, at: chaoskey_release+0x15d/0x2c0 drivers/usb/misc/chaoskey.c:322
    
    but task is already holding lock:
    ffffffff89b120e8 (chaoskey_list_lock){+.+.}-{3:3}, at: chaoskey_release+0x7f/0x2c0 drivers/usb/misc/chaoskey.c:299
    
    other info that might help us debug this:
     Possible unsafe locking scenario:
    
           CPU0
           ----
      lock(chaoskey_list_lock);
      lock(chaoskey_list_lock);
    
     *** DEADLOCK ***
    
    The second possible deadlock is:
    WARNING: possible circular locking dependency detected
    6.12.0-rc1-syzkaller-00027-g4a9fe2a8ac53 #0 Not tainted
    ------------------------------------------------------
    kworker/0:2/804 is trying to acquire lock:
    ffffffff899dadb0 (minor_rwsem){++++}-{3:3}, at: usb_deregister_dev+0x7c/0x1e0 drivers/usb/core/file.c:186
    
    but task is already holding lock:
    ffffffff89b120e8 (chaoskey_list_lock){+.+.}-{3:3}, at: chaoskey_disconnect+0xa8/0x2a0 drivers/usb/misc/chaoskey.c:235
    
    which lock already depends on the new lock.
    
    the existing dependency chain (in reverse order) is:
    
    -> #1 (chaoskey_list_lock){+.+.}-{3:3}:
           __mutex_lock_common kernel/locking/mutex.c:608 [inline]
           __mutex_lock+0x175/0x9c0 kernel/locking/mutex.c:752
           chaoskey_open+0xdd/0x220 drivers/usb/misc/chaoskey.c:274
           usb_open+0x186/0x220 drivers/usb/core/file.c:47
           chrdev_open+0x237/0x6a0 fs/char_dev.c:414
           do_dentry_open+0x6cb/0x1390 fs/open.c:958
           vfs_open+0x82/0x3f0 fs/open.c:1088
           do_open fs/namei.c:3774 [inline]
           path_openat+0x1e6a/0x2d60 fs/namei.c:3933
           do_filp_open+0x1dc/0x430 fs/namei.c:3960
           do_sys_openat2+0x17a/0x1e0 fs/open.c:1415
           do_sys_open fs/open.c:1430 [inline]
           __do_sys_openat fs/open.c:1446 [inline]
           __se_sys_openat fs/open.c:1441 [inline]
           __x64_sys_openat+0x175/0x210 fs/open.c:1441
           do_syscall_x64 arch/x86/entry/common.c:52 [inline]
           do_syscall_64+0xcd/0x250 arch/x86/entry/common.c:83
           entry_SYSCALL_64_after_hwframe+0x77/0x7f
    
    -> #0 (minor_rwsem){++++}-{3:3}:
           check_prev_add kernel/locking/lockdep.c:3161 [inline]
           check_prevs_add kernel/locking/lockdep.c:3280 [inline]
           validate_chain kernel/locking/lockdep.c:3904 [inline]
           __lock_acquire+0x250b/0x3ce0 kernel/locking/lockdep.c:5202
           lock_acquire.part.0+0x11b/0x380 kernel/locking/lockdep.c:5825
           down_write+0x93/0x200 kernel/locking/rwsem.c:1577
           usb_deregister_dev+0x7c/0x1e0 drivers/usb/core/file.c:186
           chaoskey_disconnect+0xb7/0x2a0 drivers/usb/misc/chaoskey.c:236
           usb_unbind_interface+0x1e8/0x970 drivers/usb/core/driver.c:461
           device_remove drivers/base/dd.c:569 [inline]
           device_remove+0x122/0x170 drivers/base/dd.c:561
           __device_release_driver drivers/base/dd.c:1273 [inline]
           device_release_driver_internal+0x44a/0x610 drivers/base/dd.c:1296
           bus_remove_device+0x22f/0x420 drivers/base/bus.c:576
           device_del+0x396/0x9f0 drivers/base/core.c:3864
           usb_disable_device+0x36c/0x7f0 drivers/usb/core/message.c:1418
           usb_disconnect+0x2e1/0x920 drivers/usb/core/hub.c:2304
           hub_port_connect drivers/usb/core/hub.c:5361 [inline]
           hub_port_connect_change drivers/usb/core/hub.c:5661 [inline]
           port_event drivers/usb/core/hub.c:5821 [inline]
           hub_event+0x1bed/0x4f40 drivers/usb/core/hub.c:5903
           process_one_work+0x9c5/0x1ba0 kernel/workqueue.c:3229
           process_scheduled_works kernel/workqueue.c:3310 [inline]
           worker_thread+0x6c8/0xf00 kernel/workqueue.c:3391
           kthread+0x2c1/0x3a0 kernel/kthread.c:389
           ret_from_fork+0x45/0x80 arch/x86/kernel/process.c:147
           ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:244
    
    other info that might help us debug this:
    
     Possible unsafe locking scenario:
    
           CPU0                    CPU1
           ----                    ----
      lock(chaoskey_list_lock);
                                   lock(minor_rwsem);
                                   lock(chaoskey_list_lock);
      lock(minor_rwsem);
    
     *** DEADLOCK ***
    [Analysis]
    The first is AA lock, it because wrong logic, it need a unlock.
    The second is AB lock, it needs to rearrange the order of lock usage.
    
    Fixes: 422dc0a4d12d ("USB: chaoskey: fail open after removal")
    Reported-by: syzbot+685e14d04fe35692d3bc@xxxxxxxxxxxxxxxxxxxxxxxxx
    Reported-by: syzbot+1f8ca5ee82576ec01f12@xxxxxxxxxxxxxxxxxxxxxxxxx
    Closes: https://syzkaller.appspot.com/bug?extid=685e14d04fe35692d3bc
    Signed-off-by: Edward Adam Davis <eadavis@xxxxxx>
    Tested-by: syzbot+685e14d04fe35692d3bc@xxxxxxxxxxxxxxxxxxxxxxxxx
    Reported-by: syzbot+5f1ce62e956b7b19610e@xxxxxxxxxxxxxxxxxxxxxxxxx
    Tested-by: syzbot+5f1ce62e956b7b19610e@xxxxxxxxxxxxxxxxxxxxxxxxx
    Tested-by: syzbot+1f8ca5ee82576ec01f12@xxxxxxxxxxxxxxxxxxxxxxxxx
    Link: https://lore.kernel.org/r/tencent_84EB865C89862EC22EE94CB3A7C706C59206@xxxxxx
    Cc: Oliver Neukum <oneukum@xxxxxxxx>
    Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/usb/misc/chaoskey.c b/drivers/usb/misc/chaoskey.c
index 32fa7fd50c380..d99d424c05a7a 100644
--- a/drivers/usb/misc/chaoskey.c
+++ b/drivers/usb/misc/chaoskey.c
@@ -233,10 +233,10 @@ static void chaoskey_disconnect(struct usb_interface *interface)
 	if (dev->hwrng_registered)
 		hwrng_unregister(&dev->hwrng);
 
-	mutex_lock(&chaoskey_list_lock);
 	usb_deregister_dev(interface, &chaoskey_class);
 
 	usb_set_intfdata(interface, NULL);
+	mutex_lock(&chaoskey_list_lock);
 	mutex_lock(&dev->lock);
 
 	dev->present = false;
@@ -320,7 +320,7 @@ static int chaoskey_release(struct inode *inode, struct file *file)
 bail:
 	mutex_unlock(&dev->lock);
 destruction:
-	mutex_lock(&chaoskey_list_lock);
+	mutex_unlock(&chaoskey_list_lock);
 	usb_dbg(interface, "release success");
 	return rv;
 }




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux