Bluetooth: hci_serdev: Add protocol check in hci_uart_dequeue().
authorBalakrishna Godavarthi <bgodavar@codeaurora.org>
Wed, 22 Aug 2018 12:04:12 +0000 (17:34 +0530)
committerMarcel Holtmann <marcel@holtmann.org>
Thu, 27 Sep 2018 09:59:58 +0000 (11:59 +0200)
This will help to check the status of protocol while dequeuing an
skb packet. In some instaces we will end up kernel crash,
where proto close is called and we trying to dequeue an packet.

[  500.142902] [<ffffff80080f9ce4>] do_raw_spin_lock+0x1c/0xe0
[  500.148643] [<ffffff80088f1c7c>] _raw_spin_lock_irqsave+0x38/0x48
[  500.154917] [<ffffff8008780ce8>] skb_dequeue+0x28/0x84
[  500.160209] [<ffffff8000ad6f48>] 0xffffff8000ad6f48
[  500.165230] [<ffffff8000ad6610>] 0xffffff8000ad6610
[  500.170257] [<ffffff80080c7ce8>] process_one_work+0x238/0x3e4
[  500.176174] [<ffffff80080c8330>] worker_thread+0x2bc/0x3d4
[  500.181821] [<ffffff80080cdabc>] kthread+0x138/0x140
[  500.186945] [<ffffff80080844e0>] ret_from_fork+0x10/0x18

Signed-off-by: Balakrishna Godavarthi <bgodavar@codeaurora.org>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
drivers/bluetooth/hci_serdev.c

index 46e20444ba19bdbe85163eddac4c6d93b4cbab3c..a541e6ee085ea358fbefb2faa3d63b93458612c3 100644 (file)
@@ -57,9 +57,10 @@ static inline struct sk_buff *hci_uart_dequeue(struct hci_uart *hu)
 {
        struct sk_buff *skb = hu->tx_skb;
 
-       if (!skb)
-               skb = hu->proto->dequeue(hu);
-       else
+       if (!skb) {
+               if (test_bit(HCI_UART_PROTO_READY, &hu->flags))
+                       skb = hu->proto->dequeue(hu);
+       } else
                hu->tx_skb = NULL;
 
        return skb;