Bluetooth: MGMT: Ignore keys being loaded with invalid type
BugLink: https://bugs.launchpad.net/bugs/2085849 commit 1e9683c9b6ca88cc9340cdca85edd6134c8cffe3 upstream. Due to59b047bc98there 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:59b047bc98("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> Signed-off-by: Manuel Diewald <manuel.diewald@canonical.com> Signed-off-by: Roxana Nicolescu <roxana.nicolescu@canonical.com>
This commit is contained in:
committed by
Mehmet Basaran
parent
cda4617a36
commit
01933424d1
+19
-18
@@ -2824,15 +2824,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);
|
||||
@@ -2857,6 +2848,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.
|
||||
*/
|
||||
@@ -7140,15 +7144,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);
|
||||
@@ -7165,6 +7160,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;
|
||||
|
||||
Reference in New Issue
Block a user