Bluetooth: fix hci-uart crashes
Subsystems (2)
cover Bluetooth: fix hci-uart crashes
Not every tty has a class device and this could be used to trigger NULL-pointer dereferences in two hci-uart drivers that lacked the required sanity checks.
Johan
Johan Hovold (2):
Bluetooth: hci_bcm: add missing tty-device sanity check
Bluetooth: hci_intel: add missing tty-device sanity check
drivers/bluetooth/hci_bcm.c | 5 ++++- drivers/bluetooth/hci_intel.c | 13 ++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-)
Signature · 1 line
2.12.2
PATCH 1/2 Bluetooth: hci_bcm: add missing tty-device sanity check
Make sure to check the tty-device pointer before looking up the sibling platform device to avoid dereferencing a NULL-pointer when the tty is one end of a Unix98 pty.
--- drivers/bluetooth/hci_bcm.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/bluetooth/hci_bcm.c +4 -1
@@ -287,6 +287,9 @@ static int bcm_open(struct hci_uart *hu) hu->priv = bcm; +if (!hu->tty->dev) + goto out; +mutex_lock (&bcm_device_lock);list_for_each (p, &bcm_device_list) { struct bcm_device *dev = list_entry(p, struct bcm_device, list);
@@ -307,7 +310,7 @@ static int bcm_open(struct hci_uart *hu) }mutex_unlock (&bcm_device_lock); - +out:return 0 ; }
Signature · 1 line
2.12.2
PATCH 2/2 Bluetooth: hci_intel: add missing tty-device sanity check
In reply to Johan HovoldMake sure to check the tty-device pointer before looking up the sibling platform device to avoid dereferencing a NULL-pointer when the tty is one end of a Unix98 pty.
--- drivers/bluetooth/hci_intel.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
drivers/bluetooth/hci_intel.c +12 -1
@@ -307,6 +307,9 @@ static int intel_set_power(struct hci_uart *hu, bool powered)struct list_head *p;int err = -ENODEV ; +if (!hu->tty->dev) +return err; +mutex_lock (&intel_device_list_lock);list_for_each (p, &intel_device_list) {
@@ -379,6 +382,9 @@ static void intel_busy_work(struct work_struct *work) struct intel_data *intel = container_of(work, struct intel_data, busy_work); +if (!intel->hu->tty->dev) +return ; +/* Link is busy, delay the suspend */ mutex_lock (&intel_device_list_lock);list_for_each (p, &intel_device_list) {
@@ -889,6 +895,8 @@ static int intel_setup(struct hci_uart *hu)list_for_each (p, &intel_device_list) { struct intel_device *dev = list_entry(p, struct intel_device, list); +if (!hu->tty->dev) +break ;if (hu->tty->dev->parent == dev->pdev->dev.parent) {if (device_may_wakeup (&dev->pdev->dev)) {set_bit (STATE_LPM_ENABLED , &intel->flags);
@@ -1056,6 +1064,9 @@ static int intel_enqueue(struct hci_uart *hu, struct sk_buff *skb)BT_DBG ("hu %p skb %p" , hu, skb); +if (!hu->tty->dev) + goto out_enqueue; +/* Be sure our controller is resumed and potential LPM transaction * completed before enqueuing any packet. */
@@ -1072,7 +1083,7 @@ static int intel_enqueue(struct hci_uart *hu, struct sk_buff *skb) } }mutex_unlock (&intel_device_list_lock); - +out_enqueue:skb_queue_tail (&intel->txq, skb);return 0 ;
Signature · 1 line
2.12.2
Marcel Holtmann
maintainerHi Johan,
Quoted 7 lines
Not every tty has a class device and this could be used to trigger NULL-pointer dereferences in two hci-uart drivers that lacked the required sanity checks.
Johan
Quoted 7 lines
Johan Hovold (2):
Bluetooth:hci_bcm: add missing tty-device sanity check
Bluetooth:hci_intel: add missing tty-device sanity check
drivers/bluetooth/hci_bcm.c| 5 ++++-drivers/bluetooth/hci_intel.c| 13 ++++++++++++-2 files changed, 16 insertions(+), 2 deletions(-)
bot patches have been applied to bluetooth-next tree.
Regards
Marcel