Bluetooth: Don't try to look up private addresses as Identity Address
authorJohan Hedberg <johan.hedberg@intel.com>
Tue, 18 Feb 2014 19:41:35 +0000 (21:41 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Tue, 18 Feb 2014 19:48:55 +0000 (11:48 -0800)
Identity Addresses are either public or static random. When looking up
addresses based on the Identity Address it doesn't make sense to go
through the IRK list if we're given a private random address. This patch
fixes (or rather improves) the hci_find_irk_by_addr function to bail out
early if given a private random address.

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

index cdba4709f0126bc38fd9d5e0781f076d5bb73f83..e4c5b9d6083c132fefe1bc45a0c97f41240e971e 100644 (file)
@@ -2662,6 +2662,10 @@ struct smp_irk *hci_find_irk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr,
 {
        struct smp_irk *irk;
 
+       /* Identity Address must be public or static random */
+       if (addr_type == ADDR_LE_DEV_RANDOM && (bdaddr->b[5] & 0xc0) != 0xc0)
+               return NULL;
+
        list_for_each_entry(irk, &hdev->identity_resolving_keys, list) {
                if (addr_type == irk->addr_type &&
                    bacmp(bdaddr, &irk->bdaddr) == 0)