• Tetsuo Handa's avatar
    Bluetooth: avoid hci_dev_test_and_set_flag() in mgmt_init_hdev() · f74ca25d
    Tetsuo Handa authored
    syzbot is again reporting attempt to cancel uninitialized work
    at mgmt_index_removed() [1], for setting of HCI_MGMT flag from
    mgmt_init_hdev() from hci_mgmt_cmd() from hci_sock_sendmsg() can
    race with testing of HCI_MGMT flag from mgmt_index_removed() from
    hci_sock_bind() due to lack of serialization via hci_dev_lock().
    
    Since mgmt_init_hdev() is called with mgmt_chan_list_lock held, we can
    safely split hci_dev_test_and_set_flag() into hci_dev_test_flag() and
    hci_dev_set_flag(). Thus, in order to close this race, set HCI_MGMT flag
    after INIT_DELAYED_WORK() completed.
    
    This is a local fix based on mgmt_chan_list_lock. Lack of serialization
    via hci_dev_lock() might be causing different race conditions somewhere
    else. But a global fix based on hci_dev_lock() should deserve a future
    patch.
    
    Link: https://syzkaller.appspot.com/bug?extid=844c7bf1b1aa4119c5de
    Reported-by: syzbot+844c7bf1b1aa4119c5de@syzkaller.appspotmail.com
    Signed-off-by: default avatarTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
    Fixes: 3f2893d3 ("Bluetooth: don't try to cancel uninitialized works at mgmt_index_removed()")
    Signed-off-by: default avatarLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
    f74ca25d
mgmt.c 265 KB