]> git.ipfire.org Git - thirdparty/kernel/stable.git/commit
Bluetooth: hci_core: cancel all works upon hci_unregister_dev()
authorTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Mon, 10 Jun 2024 11:00:32 +0000 (20:00 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 27 Jul 2024 08:33:43 +0000 (10:33 +0200)
commit48542881997e17b49dc16b93fe910e0cfcf7a9f9
treee85469982674140a399f6118d7571024b74d2926
parent77cfeb27b8ded33c3f4023a24a2d1517ad4e4893
Bluetooth: hci_core: cancel all works upon hci_unregister_dev()

[ Upstream commit 0d151a103775dd9645c78c97f77d6e2a5298d913 ]

syzbot is reporting that calling hci_release_dev() from hci_error_reset()
due to hci_dev_put() from hci_error_reset() can cause deadlock at
destroy_workqueue(), for hci_error_reset() is called from
hdev->req_workqueue which destroy_workqueue() needs to flush.

We need to make sure that hdev->{rx_work,cmd_work,tx_work} which are
queued into hdev->workqueue and hdev->{power_on,error_reset} which are
queued into hdev->req_workqueue are no longer running by the moment

       destroy_workqueue(hdev->workqueue);
       destroy_workqueue(hdev->req_workqueue);

are called from hci_release_dev().

Call cancel_work_sync() on these work items from hci_unregister_dev()
as soon as hdev->list is removed from hci_dev_list.

Reported-by: syzbot <syzbot+da0a9c9721e36db712e8@syzkaller.appspotmail.com>
Closes: https://syzkaller.appspot.com/bug?extid=da0a9c9721e36db712e8
Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/bluetooth/hci_core.c