Diff between b13c0888882bfd0c1e4a731dd321aa94e21000b0 and daf46a2b635f8cea5ae1f77f690b4ce27ac9f7e9

Changed Files

File Additions Deletions Status
src/adapter.c +18 -0 modified

Full Patch

diff --git a/src/adapter.c b/src/adapter.c
index 303979d..08296bd 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -2261,6 +2261,24 @@ static struct smp_ltk_info *get_ltk(GKeyFile *key_file, const char *peer,
 
 	str2ba(peer, &ltk->bdaddr);
 	ltk->bdaddr_type = peer_type;
+
+	/*
+	 * Long term keys should respond to an identity address which can
+	 * either be a public address or a random static address. Keys
+	 * stored for resolvable random and unresolvable random addresses
+	 * are ignored.
+	 *
+	 * This is an extra sanity check for older kernel versions or older
+	 * daemons that might have been instructed to store long term keys
+	 * for these temporary addresses.
+	 */
+	if (ltk->bdaddr_type == BDADDR_LE_RANDOM &&
+					(ltk->bdaddr.b[5] & 0xc0) != 0xc0) {
+		g_free(ltk);
+		ltk = NULL;
+		goto failed;
+	}
+
 	str2buf(&key[2], ltk->val, sizeof(ltk->val));
 	str2buf(&rand[2], ltk->rand, sizeof(ltk->rand));