Bluetooth: Fix calling smp_distribute_keys() when still waiting for keys
authorJohan Hedberg <johan.hedberg@intel.com>
Fri, 5 Sep 2014 19:19:54 +0000 (22:19 +0300)
committerMarcel Holtmann <marcel@holtmann.org>
Mon, 8 Sep 2014 17:07:56 +0000 (19:07 +0200)
When we're in the process of receiving keys in phase 3 of SMP we keep
track of which keys are still expected in the smp->remote_key_dist
variable. If we still have some key bits set we need to continue waiting
for more PDUs and not needlessly call smp_distribute_keys(). This patch
fixes two such cases in the smp_cmd_master_ident() and
smp_cmd_ident_addr_info() handler functions.

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

index 5003d22..e76c963 100644 (file)
@@ -1293,7 +1293,7 @@ static int smp_cmd_master_ident(struct l2cap_conn *conn, struct sk_buff *skb)
                          authenticated, smp->tk, smp->enc_key_size,
                          rp->ediv, rp->rand);
        smp->ltk = ltk;
-       if (!(smp->remote_key_dist & SMP_DIST_ID_KEY))
+       if (!(smp->remote_key_dist & KEY_DIST_MASK))
                smp_distribute_keys(smp);
        hci_dev_unlock(hdev);
 
@@ -1371,7 +1371,8 @@ static int smp_cmd_ident_addr_info(struct l2cap_conn *conn,
                                      smp->id_addr_type, smp->irk, &rpa);
 
 distribute:
-       smp_distribute_keys(smp);
+       if (!(smp->remote_key_dist & KEY_DIST_MASK))
+               smp_distribute_keys(smp);
 
        hci_dev_unlock(hcon->hdev);