Bluetooth: Fix hci_remove_ltk failure when no match is found
authorJohan Hedberg <johan.hedberg@intel.com>
Tue, 18 Feb 2014 15:14:33 +0000 (17:14 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Tue, 18 Feb 2014 16:58:20 +0000 (08:58 -0800)
There is code (in mgmt.c) that depends on the hci_remove_ltk function to
fail if no match is found. This patch adds tracking of removed LTKs
(there can be up to two: one for master and another for slave) in the
hci_remove_ltk function and returns -ENOENT of no matches were found.

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

index fd5bb4086613287f0e4304c9fdabb9688040c57b..69b7145bfce2dfe1398a19f0ce4c509fa4ef925b 100644 (file)
@@ -2807,6 +2807,7 @@ int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr)
 int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 bdaddr_type)
 {
        struct smp_ltk *k, *tmp;
+       int removed = 0;
 
        list_for_each_entry_safe(k, tmp, &hdev->long_term_keys, list) {
                if (bacmp(bdaddr, &k->bdaddr) || k->bdaddr_type != bdaddr_type)
@@ -2816,9 +2817,10 @@ int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 bdaddr_type)
 
                list_del(&k->list);
                kfree(k);
+               removed++;
        }
 
-       return 0;
+       return removed ? 0 : -ENOENT;
 }
 
 /* HCI command timer function */