Skip to contentSkip to conversation

drivers/bluetooth/hci_ldisc.c: fix possible NULL dereferences

PATCH In review Eugene Teo 3 participants 5 messages Jul 29, 2007 – Jul 30, 2007 Bluetooth drivers

lore
Share & tools
lore

Eugene Teo

author
#0 lore raw

PATCH 1/1 drivers/bluetooth/hci_ldisc.c: fix possible NULL dereferences

Commit 22ad42033b7d2b3d7928fba9f89d1c7f8a3c9581 did not completely fix all the possible NULL dereferences. Besides hci_uart_close(), we also need to make sure that hdev is valid before calling hci_{unregister,free}_dev().

---
 drivers/bluetooth/hci_ldisc.c |    7 +++----
 1 files changed, 3 insertions(+), 4 deletions(-)
drivers/bluetooth/hci_ldisc.c +3 -4
index 6055b9c..4813f7c 100644
@@ -308,11 +308,10 @@ static void hci_uart_tty_close(struct tty_struct *tty)
 	if (hu) {
 		struct hci_dev *hdev = hu->hdev;
 
-		if (hdev)
+		if (hdev) {
 			hci_uart_close(hdev);
-
-		if (test_and_clear_bit(HCI_UART_PROTO_SET, &hu->flags)) {
-			hu->proto->close(hu);
+			if (test_and_clear_bit(HCI_UART_PROTO_SET, &hu->flags))
+				hu->proto->close(hu);
 			hci_unregister_dev(hdev);
 			hci_free_dev(hdev);
 		}
maintainer
#1 lore raw

Hi Eugene,

Quoted 3 lines

Commit 22ad42033b7d2b3d7928fba9f89d1c7f8a3c9581 did not completely fix all the possible NULL dereferences. Besides hci_uart_close(), we also need to make sure that hdev is valid before calling hci_{unregister,free}_dev().

I don't see any issue. Without HCI_UART_PROTO_SET, the hdev will never be registered. So no need to protect it twice.

Regards

Marcel

#2 lore raw

Hi Marcel,

Quoted 6 lines · Marcel Holtmann
Quoted 3 lines

Commit 22ad42033b7d2b3d7928fba9f89d1c7f8a3c9581 did not completely fix all the possible NULL dereferences. Besides hci_uart_close(), we also need to make sure that hdev is valid before calling hci_{unregister,free}_dev().

I don't see any issue. Without HCI_UART_PROTO_SET, the hdev will never be registered. So no need to protect it twice.

Correct me if I am wrong. HCI_UART_PROTO_SET bit is only set if hci_uart_tty_ioctl() is called with HCIUARTSETPROTO. Is it possible for the HCI device to be registered and then unregistered without setting the HCI_UART_PROTO_SET bit in hdev->flags?

Thanks,
Eugene

maintainer
#3 lore raw

Hi Eugene,

Quoted 10 lines
Quoted 6 lines
Quoted 3 lines

Commit 22ad42033b7d2b3d7928fba9f89d1c7f8a3c9581 did not completely fix all the possible NULL dereferences. Besides hci_uart_close(), we also need to make sure that hdev is valid before calling hci_{unregister,free}_dev().

I don't see any issue. Without HCI_UART_PROTO_SET, the hdev will never be registered. So no need to protect it twice.

Correct me if I am wrong. HCI_UART_PROTO_SET bit is only set if hci_uart_tty_ioctl() is called with HCIUARTSETPROTO. Is it possible for the HCI device to be registered and then unregistered without setting the HCI_UART_PROTO_SET bit in hdev->flags?

look at the code. The hci_uart_tty_ioctl() is the only function that can register the HCI device. So besides opening the TTY and set the line discipline, you also have to the set the UART protocol running on top. I don't see any way you can achieve to register a HCI device without setting the HCI_UART_PROTO_SET bit in hu->flags.

Regards

Marcel

#4 lore raw

Hi Marcel,

Quoted 9 lines · Marcel Holtmann
Quoted 8 lines
Quoted 5 lines
Quoted 3 lines

Commit 22ad42033b7d2b3d7928fba9f89d1c7f8a3c9581 did not completely fix all the possible NULL dereferences. Besides hci_uart_close(), we also need to make sure that hdev is valid before calling hci_{unregister,free}_dev().

I don't see any issue. Without HCI_UART_PROTO_SET, the hdev will never be registered. So no need to protect it twice.

Correct me if I am wrong. HCI_UART_PROTO_SET bit is only set if hci_uart_tty_ioctl() is called with HCIUARTSETPROTO. Is it possible for the HCI device to be registered and then unregistered without setting the HCI_UART_PROTO_SET bit in hdev->flags?

Quoted 5 lines

look at the code. The hci_uart_tty_ioctl() is the only function that can register the HCI device. So besides opening the TTY and set the line discipline, you also have to the set the UART protocol running on top. I don't see any way you can achieve to register a HCI device without setting the HCI_UART_PROTO_SET bit in hu->flags.

Ok. Thanks for the explanation.

Eugene