]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
Bluetooth: MGMT: Ignore keys being loaded with invalid type
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Tue, 27 Aug 2024 19:01:34 +0000 (15:01 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 12 Sep 2024 09:06:43 +0000 (11:06 +0200)
commit 1e9683c9b6ca88cc9340cdca85edd6134c8cffe3 upstream.

Due to 59b047bc98084f8af2c41483e4d68a5adf2fa7f7 there could be keys stored
with the wrong address type so this attempt to detect it and ignore them
instead of just failing to load all keys.

Cc: stable@vger.kernel.org
Link: https://github.com/bluez/bluez/issues/875
Fixes: 59b047bc9808 ("Bluetooth: MGMT/SMP: Fix address type when using SMP over BREDR/LE")
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
net/bluetooth/mgmt.c

index d254127b6d20e9ff345d0d05fabf70733d6bd6d4..51b16c2a279f4c98c8daa2ada2c0e5bbed9062e6 100644 (file)
@@ -2370,15 +2370,6 @@ static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
        bt_dev_dbg(hdev, "debug_keys %u key_count %u", cp->debug_keys,
                   key_count);
 
-       for (i = 0; i < key_count; i++) {
-               struct mgmt_link_key_info *key = &cp->keys[i];
-
-               if (key->addr.type != BDADDR_BREDR || key->type > 0x08)
-                       return mgmt_cmd_status(sk, hdev->id,
-                                              MGMT_OP_LOAD_LINK_KEYS,
-                                              MGMT_STATUS_INVALID_PARAMS);
-       }
-
        hci_dev_lock(hdev);
 
        hci_link_keys_clear(hdev);
@@ -2403,6 +2394,19 @@ static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
                        continue;
                }
 
+               if (key->addr.type != BDADDR_BREDR) {
+                       bt_dev_warn(hdev,
+                                   "Invalid link address type %u for %pMR",
+                                   key->addr.type, &key->addr.bdaddr);
+                       continue;
+               }
+
+               if (key->type > 0x08) {
+                       bt_dev_warn(hdev, "Invalid link key type %u for %pMR",
+                                   key->type, &key->addr.bdaddr);
+                       continue;
+               }
+
                /* Always ignore debug keys and require a new pairing if
                 * the user wants to use them.
                 */
@@ -5993,15 +5997,6 @@ static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
 
        bt_dev_dbg(hdev, "key_count %u", key_count);
 
-       for (i = 0; i < key_count; i++) {
-               struct mgmt_ltk_info *key = &cp->keys[i];
-
-               if (!ltk_is_valid(key))
-                       return mgmt_cmd_status(sk, hdev->id,
-                                              MGMT_OP_LOAD_LONG_TERM_KEYS,
-                                              MGMT_STATUS_INVALID_PARAMS);
-       }
-
        hci_dev_lock(hdev);
 
        hci_smp_ltks_clear(hdev);
@@ -6018,6 +6013,12 @@ static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
                        continue;
                }
 
+               if (!ltk_is_valid(key)) {
+                       bt_dev_warn(hdev, "Invalid LTK for %pMR",
+                                   &key->addr.bdaddr);
+                       continue;
+               }
+
                switch (key->type) {
                case MGMT_LTK_UNAUTHENTICATED:
                        authenticated = 0x00;