From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx> 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(-) diff --git a/src/adapter.c b/src/adapter.c index 2bb94cf1673e..f422bbaae155 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -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); -- 2.47.0