mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 17:13:52 +02:00
Bluetooth: hci_uart: Cancel init work before unregistering
If hci_uart_tty_close() or hci_uart_unregister_device() is called while
hu->init_ready is scheduled, hci_register_dev() could be called after
the hci_uart is torn down. Avoid this by ensuring the work is complete
or canceled before checking the HCI_UART_REGISTERED flag.
Fixes: 9f2aee848f ("Bluetooth: Add delayed init sequence support for UART controllers")
Signed-off-by: Samuel Holland <samuel@sholland.org>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
parent
b5f628a20a
commit
3b799254cf
|
|
@ -538,6 +538,7 @@ static void hci_uart_tty_close(struct tty_struct *tty)
|
||||||
clear_bit(HCI_UART_PROTO_READY, &hu->flags);
|
clear_bit(HCI_UART_PROTO_READY, &hu->flags);
|
||||||
percpu_up_write(&hu->proto_lock);
|
percpu_up_write(&hu->proto_lock);
|
||||||
|
|
||||||
|
cancel_work_sync(&hu->init_ready);
|
||||||
cancel_work_sync(&hu->write_work);
|
cancel_work_sync(&hu->write_work);
|
||||||
|
|
||||||
if (hdev) {
|
if (hdev) {
|
||||||
|
|
|
||||||
|
|
@ -355,6 +355,8 @@ void hci_uart_unregister_device(struct hci_uart *hu)
|
||||||
struct hci_dev *hdev = hu->hdev;
|
struct hci_dev *hdev = hu->hdev;
|
||||||
|
|
||||||
clear_bit(HCI_UART_PROTO_READY, &hu->flags);
|
clear_bit(HCI_UART_PROTO_READY, &hu->flags);
|
||||||
|
|
||||||
|
cancel_work_sync(&hu->init_ready);
|
||||||
if (test_bit(HCI_UART_REGISTERED, &hu->flags))
|
if (test_bit(HCI_UART_REGISTERED, &hu->flags))
|
||||||
hci_unregister_dev(hdev);
|
hci_unregister_dev(hdev);
|
||||||
hci_free_dev(hdev);
|
hci_free_dev(hdev);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user