• Tetsuo Handa's avatar
    Bluetooth: defer cleanup of resources in hci_unregister_dev() · 58ce6d5b
    Tetsuo Handa authored
    syzbot is hitting might_sleep() warning at hci_sock_dev_event()
    due to calling lock_sock() with rw spinlock held [1].
    
    It seems that history of this locking problem is a trial and error.
    
    Commit b40df574 ("[PATCH] bluetooth: fix socket locking in
    hci_sock_dev_event()") in 2.6.21-rc4 changed bh_lock_sock() to lock_sock()
    as an attempt to fix lockdep warning.
    
    Then, commit 4ce61d1c ("[BLUETOOTH]: Fix locking in
    hci_sock_dev_event().") in 2.6.22-rc2 changed lock_sock() to
    local_bh_disable() + bh_lock_sock_nested() as an attempt to fix
    sleep in atomic context warning.
    
    Then, commit 4b5dd696 ("Bluetooth: Remove local_bh_disable() from
    hci_sock.c") in 3.3-rc1 removed local_bh_disable().
    
    Then, commit e305509e ("Bluetooth: use correct lock to prevent UAF
    of hdev object") in 5.13-rc5 again changed bh_lock_sock_nested() to
    lock_sock() as an attempt to fix CVE-2021-3573.
    
    This difficulty comes from current implementation that
    hci_sock_dev_event(HCI_DEV_UNREG) is responsible for dropping all
    references from sockets because hci_unregister_dev() immediately reclaims
    resources as soon as returning from hci_sock_dev_event(HCI_DEV_UNREG).
    But the history suggests that hci_sock_dev_event(HCI_DEV_UNREG) was not
    doing what it should do.
    
    Therefore, instead of trying to detach sockets from device, let's accept
    not detaching sockets from device at hci_sock_dev_event(HCI_DEV_UNREG),
    by moving actual cleanup of resources from hci_unregister_dev() to
    hci_release_dev() which is called by bt_host_release when all references
    to this unregistered device (which is a kobject) are gone.
    
    Link: https://syzkaller.appspot.com/bug?extid=a5df189917e79d5e59c9 [1]
    Reported-by: default avatarsyzbot <syzbot+a5df189917e79d5e59c9@syzkaller.appspotmail.com>
    Signed-off-by: default avatarTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
    Tested-by: default avatarsyzbot <syzbot+a5df189917e79d5e59c9@syzkaller.appspotmail.com>
    Fixes: e305509e ("Bluetooth: use correct lock to prevent UAF of hdev object")
    Signed-off-by: default avatarLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
    58ce6d5b
hci_sysfs.c 2.19 KB