Bluetooth: Add paranoid check for existing LE and BR/EDR SMP channels
authorMarcel Holtmann <marcel@holtmann.org>
Thu, 15 Jan 2015 16:04:21 +0000 (08:04 -0800)
committerJohan Hedberg <johan.hedberg@intel.com>
Thu, 15 Jan 2015 19:59:38 +0000 (21:59 +0200)
When the SMP channels have been already registered, then print out a
clear WARN_ON message that something went wrong. Also unregister the
existing channels in this case before trying to register new ones.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
net/bluetooth/smp.c

index 08a9314f3ca7f9d19bef0c98105545f839509d7e..37d9180bfe1c559902279da1ae4ba08422e2d50a 100644 (file)
@@ -3072,6 +3072,12 @@ int smp_register(struct hci_dev *hdev)
        if (!lmp_le_capable(hdev))
                return 0;
 
+       if (WARN_ON(hdev->smp_data)) {
+               chan = hdev->smp_data;
+               hdev->smp_data = NULL;
+               smp_del_chan(chan);
+       }
+
        chan = smp_add_cid(hdev, L2CAP_CID_SMP);
        if (IS_ERR(chan))
                return PTR_ERR(chan);
@@ -3091,6 +3097,12 @@ int smp_register(struct hci_dev *hdev)
                return 0;
        }
 
+       if (WARN_ON(hdev->smp_bredr_data)) {
+               chan = hdev->smp_bredr_data;
+               hdev->smp_bredr_data = NULL;
+               smp_del_chan(chan);
+       }
+
        chan = smp_add_cid(hdev, L2CAP_CID_SMP_BREDR);
        if (IS_ERR(chan)) {
                int err = PTR_ERR(chan);