When stopping BCSP/H5, stop the retransmission timer before proceeding
to clean up packet queues.  The previous code had a race condition where
the timer could trigger after the packet lists and protocol structure
had been removed which led to dereferencing NULL or use-after-free bugs.
Signed-off-by: Michael Knudsen <m.knudsen@samsung.com>
Reported-by: Kirill Tkhai <ktkhai@parallels.com>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
 static int bcsp_close(struct hci_uart *hu)
 {
        struct bcsp_struct *bcsp = hu->priv;
+
+       del_timer_sync(&bcsp->tbcsp);
+
        hu->priv = NULL;
 
        BT_DBG("hu %p", hu);
        skb_queue_purge(&bcsp->unack);
        skb_queue_purge(&bcsp->rel);
        skb_queue_purge(&bcsp->unrel);
-       del_timer(&bcsp->tbcsp);
 
        kfree(bcsp);
        return 0;
 
 {
        struct h5 *h5 = hu->priv;
 
+       del_timer_sync(&h5->timer);
+
        skb_queue_purge(&h5->unack);
        skb_queue_purge(&h5->rel);
        skb_queue_purge(&h5->unrel);
 
-       del_timer(&h5->timer);
-
        kfree(h5);
 
        return 0;