@@ -3994,6 +3994,13 @@ static struct link_key_info *get_key_info(GKeyFile *key_file, const char *peer,
str2ba(peer, &info->bdaddr);
info->bdaddr_type = bdaddr_type;
+ /* Fix up address type if it was stored with the wrong
+ * address type since Load Link Keys are only meant to
+ * work with BR/EDR addresses as per MGMT documentation.
+ */
+ if (info->bdaddr_type != BDADDR_BREDR)
+ info->bdaddr_type = BDADDR_BREDR;
+
if (!strncmp(str, "0x", 2))
str2buf(&str[2], info->key, sizeof(info->key));
else
@@ -4035,6 +4042,13 @@ static struct smp_ltk_info *get_ltk(GKeyFile *key_file, const char *peer,
str2ba(peer, <k->bdaddr);
ltk->bdaddr_type = peer_type;
+ /* Fix up address type if it was stored with the wrong
+ * address type since Load Long Term Keys are only meant
+ * to work with LE addresses as per MGMT documentation.
+ */
+ if (ltk->bdaddr_type == BDADDR_BREDR)
+ ltk->bdaddr_type = BDADDR_LE_PUBLIC;
+
/*
* Long term keys should respond to an identity address which can
* either be a public address or a random static address. Keys
@@ -4117,7 +4131,8 @@ static struct irk_info *get_irk_info(GKeyFile *key_file, const char *peer,
struct irk_info *irk = NULL;
char *str;
- str = g_key_file_get_string(key_file, "IdentityResolvingKey", "Key", NULL);
+ str = g_key_file_get_string(key_file, "IdentityResolvingKey", "Key",
+ NULL);
if (!str || strlen(str) < 32)
goto failed;
@@ -4126,6 +4141,13 @@ static struct irk_info *get_irk_info(GKeyFile *key_file, const char *peer,
str2ba(peer, &irk->bdaddr);
irk->bdaddr_type = bdaddr_type;
+ /* Fix up address type if it was stored with the wrong
+ * address type since Load Identity Keys are only meant
+ * to work with LE addresses as per MGMT documentation.
+ */
+ if (irk->bdaddr_type == BDADDR_BREDR)
+ irk->bdaddr_type = BDADDR_LE_PUBLIC;
+
if (!strncmp(str, "0x", 2))
str2buf(&str[2], irk->val, sizeof(irk->val));
else
@@ -5000,27 +5022,11 @@ static void load_devices(struct btd_adapter *adapter)
goto free;
}
- if (key_info) {
- /* Fix up address type if it was stored with the wrong
- * address type since Load Link Keys are only meant to
- * work with BR/EDR addresses as per MGMT documentation.
- */
- if (key_info->bdaddr_type != BDADDR_BREDR)
- key_info->bdaddr_type = BDADDR_BREDR;
-
+ if (key_info)
keys = g_slist_append(keys, key_info);
- }
-
- if (ltk_info) {
- /* Fix up address type if it was stored with the wrong
- * address type since Load Long Term Keys are only meant
- * to work with LE addresses as per MGMT documentation.
- */
- if (ltk_info->bdaddr_type == BDADDR_BREDR)
- ltk_info->bdaddr_type = BDADDR_LE_PUBLIC;
+ if (ltk_info)
ltks = g_slist_append(ltks, ltk_info);
- }
if (peripheral_ltk_info)
ltks = g_slist_append(ltks, peripheral_ltk_info);
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com> 66a8c522b64 ("adapter: Fix up address type when loading keys") didn't fix all instances of wrong address type being loaded, so peripheral LTK and IRK were still left with possible invalid types. --- src/adapter.c | 44 +++++++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 19 deletions(-)