• Ying Hsu's avatar
    Bluetooth: Fix possible deadlock in rfcomm_sk_state_change · 1d80d57f
    Ying Hsu authored
    syzbot reports a possible deadlock in rfcomm_sk_state_change [1].
    While rfcomm_sock_connect acquires the sk lock and waits for
    the rfcomm lock, rfcomm_sock_release could have the rfcomm
    lock and hit a deadlock for acquiring the sk lock.
    Here's a simplified flow:
    
    rfcomm_sock_connect:
      lock_sock(sk)
      rfcomm_dlc_open:
        rfcomm_lock()
    
    rfcomm_sock_release:
      rfcomm_sock_shutdown:
        rfcomm_lock()
        __rfcomm_dlc_close:
            rfcomm_k_state_change:
    	  lock_sock(sk)
    
    This patch drops the sk lock before calling rfcomm_dlc_open to
    avoid the possible deadlock and holds sk's reference count to
    prevent use-after-free after rfcomm_dlc_open completes.
    
    Reported-by: syzbot+d7ce59...@syzkaller.appspotmail.com
    Fixes: 1804fdf6 ("Bluetooth: btintel: Combine setting up MSFT extension")
    Link: https://syzkaller.appspot.com/bug?extid=d7ce59b06b3eb14fd218 [1]
    Signed-off-by: default avatarYing Hsu <yinghsu@chromium.org>
    Signed-off-by: default avatarLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
    1d80d57f
sock.c 22.5 KB