Bluetooth: Fix using address type from events
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Mon, 30 Aug 2021 20:55:36 +0000 (13:55 -0700)
committerMarcel Holtmann <marcel@holtmann.org>
Mon, 30 Aug 2021 21:14:55 +0000 (23:14 +0200)
Address types ADDR_LE_DEV_PUBLIC_RESOLVED and
ADDR_LE_DEV_RANDOM_RESOLVED shall be converted to ADDR_LE_PUBLIC and
ADDR_LE_RANDOM repectively since they are not safe to be used beyond
the scope of the events themselves.

Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
net/bluetooth/hci_core.c
net/bluetooth/hci_event.c

index 8a47a30..f3a18d1 100644 (file)
@@ -3487,15 +3487,6 @@ struct hci_conn_params *hci_pend_le_action_lookup(struct list_head *list,
 {
        struct hci_conn_params *param;
 
-       switch (addr_type) {
-       case ADDR_LE_DEV_PUBLIC_RESOLVED:
-               addr_type = ADDR_LE_DEV_PUBLIC;
-               break;
-       case ADDR_LE_DEV_RANDOM_RESOLVED:
-               addr_type = ADDR_LE_DEV_RANDOM;
-               break;
-       }
-
        list_for_each_entry(param, list, action) {
                if (bacmp(&param->addr, addr) == 0 &&
                    param->addr_type == addr_type)
index 293d4c9..1934a4b 100644 (file)
@@ -2367,6 +2367,22 @@ static void hci_cs_disconnect(struct hci_dev *hdev, u8 status)
        hci_dev_unlock(hdev);
 }
 
+static u8 ev_bdaddr_type(struct hci_dev *hdev, u8 type)
+{
+       /* When using controller based address resolution, then the new
+        * address types 0x02 and 0x03 are used. These types need to be
+        * converted back into either public address or random address type
+        */
+       switch (type) {
+       case ADDR_LE_DEV_PUBLIC_RESOLVED:
+               return ADDR_LE_DEV_PUBLIC;
+       case ADDR_LE_DEV_RANDOM_RESOLVED:
+               return ADDR_LE_DEV_RANDOM;
+       }
+
+       return type;
+}
+
 static void cs_le_create_conn(struct hci_dev *hdev, bdaddr_t *peer_addr,
                              u8 peer_addr_type, u8 own_address_type,
                              u8 filter_policy)
@@ -2378,21 +2394,7 @@ static void cs_le_create_conn(struct hci_dev *hdev, bdaddr_t *peer_addr,
        if (!conn)
                return;
 
-       /* When using controller based address resolution, then the new
-        * address types 0x02 and 0x03 are used. These types need to be
-        * converted back into either public address or random address type
-        */
-       if (use_ll_privacy(hdev) &&
-           hci_dev_test_flag(hdev, HCI_LL_RPA_RESOLUTION)) {
-               switch (own_address_type) {
-               case ADDR_LE_DEV_PUBLIC_RESOLVED:
-                       own_address_type = ADDR_LE_DEV_PUBLIC;
-                       break;
-               case ADDR_LE_DEV_RANDOM_RESOLVED:
-                       own_address_type = ADDR_LE_DEV_RANDOM;
-                       break;
-               }
-       }
+       own_address_type = ev_bdaddr_type(hdev, own_address_type);
 
        /* Store the initiator and responder address information which
         * is needed for SMP. These values will not change during the
@@ -5282,22 +5284,7 @@ static void le_conn_complete_evt(struct hci_dev *hdev, u8 status,
                conn->dst_type = irk->addr_type;
        }
 
-       /* When using controller based address resolution, then the new
-        * address types 0x02 and 0x03 are used. These types need to be
-        * converted back into either public address or random address type
-        */
-       if (use_ll_privacy(hdev) &&
-           hci_dev_test_flag(hdev, HCI_ENABLE_LL_PRIVACY) &&
-           hci_dev_test_flag(hdev, HCI_LL_RPA_RESOLUTION)) {
-               switch (conn->dst_type) {
-               case ADDR_LE_DEV_PUBLIC_RESOLVED:
-                       conn->dst_type = ADDR_LE_DEV_PUBLIC;
-                       break;
-               case ADDR_LE_DEV_RANDOM_RESOLVED:
-                       conn->dst_type = ADDR_LE_DEV_RANDOM;
-                       break;
-               }
-       }
+       conn->dst_type = ev_bdaddr_type(hdev, conn->dst_type);
 
        if (status) {
                hci_le_conn_failed(conn, status);
@@ -5619,6 +5606,8 @@ static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
         * controller address.
         */
        if (direct_addr) {
+               direct_addr_type = ev_bdaddr_type(hdev, direct_addr_type);
+
                /* Only resolvable random addresses are valid for these
                 * kind of reports and others can be ignored.
                 */
@@ -5646,6 +5635,8 @@ static void process_adv_report(struct hci_dev *hdev, u8 type, bdaddr_t *bdaddr,
                bdaddr_type = irk->addr_type;
        }
 
+       bdaddr_type = ev_bdaddr_type(hdev, bdaddr_type);
+
        /* Check if we have been requested to connect to this device.
         *
         * direct_addr is set only for directed advertising reports (it is NULL