]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Bluetooth: Move IRK checking logic in preparation to new connect method
authorJakub Pawlowski <jpawlowski@google.com>
Mon, 20 Jul 2015 11:12:49 +0000 (13:12 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Thu, 23 Jul 2015 15:10:51 +0000 (17:10 +0200)
Move IRK checking logic in preparation to new connect method. Also
make sure that MGMT_STATUS_INVALID_PARAMS is returned when non
identity address is passed to ADD_DEVICE. Right now MGMT_STATUS_FAILED
is returned, which might be misleading.

Signed-off-by: Jakub Pawlowski <jpawlowski@google.com>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
net/bluetooth/hci_core.c
net/bluetooth/mgmt.c

index 2f8fb33067e1c48fedf3055ddf29a3be68161c9f..bc43b6490555c7d75dae8ac452a7b012c8f1ffa1 100644 (file)
@@ -2822,10 +2822,6 @@ struct hci_conn_params *hci_conn_params_lookup(struct hci_dev *hdev,
 {
        struct hci_conn_params *params;
 
-       /* The conn params list only contains identity addresses */
-       if (!hci_is_identity_address(addr, addr_type))
-               return NULL;
-
        list_for_each_entry(params, &hdev->le_conn_params, list) {
                if (bacmp(&params->addr, addr) == 0 &&
                    params->addr_type == addr_type) {
@@ -2842,10 +2838,6 @@ struct hci_conn_params *hci_pend_le_action_lookup(struct list_head *list,
 {
        struct hci_conn_params *param;
 
-       /* The list only contains identity addresses */
-       if (!hci_is_identity_address(addr, addr_type))
-               return NULL;
-
        list_for_each_entry(param, list, action) {
                if (bacmp(&param->addr, addr) == 0 &&
                    param->addr_type == addr_type)
@@ -2861,9 +2853,6 @@ struct hci_conn_params *hci_conn_params_add(struct hci_dev *hdev,
 {
        struct hci_conn_params *params;
 
-       if (!hci_is_identity_address(addr, addr_type))
-               return NULL;
-
        params = hci_conn_params_lookup(hdev, addr, addr_type);
        if (params)
                return params;
index 7998fb27916568da087b2734a017355158044a75..7ab191589541c8fab56d47ab9f0e21f050751de9 100644 (file)
@@ -6226,6 +6226,17 @@ static int add_device(struct sock *sk, struct hci_dev *hdev,
        else
                auto_conn = HCI_AUTO_CONN_REPORT;
 
+       /* Kernel internally uses conn_params with resolvable private
+        * address, but Add Device allows only identity addresses.
+        * Make sure it is enforced before calling
+        * hci_conn_params_lookup.
+        */
+       if (!hci_is_identity_address(&cp->addr.bdaddr, addr_type)) {
+               err = cmd->cmd_complete(cmd, MGMT_STATUS_INVALID_PARAMS);
+               mgmt_pending_remove(cmd);
+               goto unlock;
+       }
+
        /* If the connection parameters don't exist for this device,
         * they will be created and configured with defaults.
         */
@@ -6340,6 +6351,18 @@ static int remove_device(struct sock *sk, struct hci_dev *hdev,
                else
                        addr_type = ADDR_LE_DEV_RANDOM;
 
+               /* Kernel internally uses conn_params with resolvable private
+                * address, but Remove Device allows only identity addresses.
+                * Make sure it is enforced before calling
+                * hci_conn_params_lookup.
+                */
+               if (!hci_is_identity_address(&cp->addr.bdaddr, addr_type)) {
+                       err = cmd->cmd_complete(cmd,
+                                               MGMT_STATUS_INVALID_PARAMS);
+                       mgmt_pending_remove(cmd);
+                       goto unlock;
+               }
+
                params = hci_conn_params_lookup(hdev, &cp->addr.bdaddr,
                                                addr_type);
                if (!params) {