Skip to content

Commit a1dbb34

Browse files
Kefeng Wanggregkh
authored andcommitted
Bluetooth: hci_ldisc: Postpone HCI_UART_PROTO_READY bit set in hci_uart_set_proto()
commit 56897b2 upstream. task A: task B: hci_uart_set_proto flush_to_ldisc - p->open(hu) -> h5_open //alloc h5 - receive_buf - set_bit HCI_UART_PROTO_READY - tty_port_default_receive_buf - hci_uart_register_dev - tty_ldisc_receive_buf - hci_uart_tty_receive - test_bit HCI_UART_PROTO_READY - h5_recv - clear_bit HCI_UART_PROTO_READY while() { - p->open(hu) -> h5_close //free h5 - h5_rx_3wire_hdr - h5_reset() //use-after-free } It could use ioctl to set hci uart proto, but there is a use-after-free issue when hci_uart_register_dev() fail in hci_uart_set_proto(), see stack above, fix this by setting HCI_UART_PROTO_READY bit only when hci_uart_register_dev() return success. Reported-by: [email protected] Signed-off-by: Kefeng Wang <[email protected]> Reviewed-by: Jeremy Cline <[email protected]> Signed-off-by: Marcel Holtmann <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 6ea83d9 commit a1dbb34

File tree

1 file changed

+1
-2
lines changed

1 file changed

+1
-2
lines changed

drivers/bluetooth/hci_ldisc.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -692,14 +692,13 @@ static int hci_uart_set_proto(struct hci_uart *hu, int id)
692692
return -EPROTONOSUPPORT;
693693

694694
hu->proto = p;
695-
set_bit(HCI_UART_PROTO_READY, &hu->flags);
696695

697696
err = hci_uart_register_dev(hu);
698697
if (err) {
699-
clear_bit(HCI_UART_PROTO_READY, &hu->flags);
700698
return err;
701699
}
702700

701+
set_bit(HCI_UART_PROTO_READY, &hu->flags);
703702
return 0;
704703
}
705704

0 commit comments

Comments
 (0)