Diff between 581aae6a2722e69479f4846e7b00c43fdf112b4c and 3842320f450e0b40b205b8fd0ce13b8821d49b51

Changed Files

File Additions Deletions Status
src/gatt-database.c +16 -2 modified

Full Patch

diff --git a/src/gatt-database.c b/src/gatt-database.c
index ea282d4..3b53bf2 100644
--- a/src/gatt-database.c
+++ b/src/gatt-database.c
@@ -632,6 +632,7 @@ static void connect_cb(GIOChannel *io, GError *gerr, gpointer user_data)
 	struct btd_device *device;
 	uint8_t dst_type;
 	bdaddr_t src, dst;
+	uint16_t cid;
 
 	if (gerr) {
 		error("%s", gerr->message);
@@ -641,6 +642,7 @@ static void connect_cb(GIOChannel *io, GError *gerr, gpointer user_data)
 	bt_io_get(io, &gerr, BT_IO_OPT_SOURCE_BDADDR, &src,
 						BT_IO_OPT_DEST_BDADDR, &dst,
 						BT_IO_OPT_DEST_TYPE, &dst_type,
+						BT_IO_OPT_CID, &cid,
 						BT_IO_OPT_INVALID);
 	if (gerr) {
 		error("bt_io_get: %s", gerr->message);
@@ -655,9 +657,21 @@ static void connect_cb(GIOChannel *io, GError *gerr, gpointer user_data)
 	if (!adapter)
 		return;
 
-	device = btd_adapter_get_device(adapter, &dst, dst_type);
-	if (!device)
+	/* Check cid before attempting to create device, if the device is using
+	 * an RPA it could be that the MGMT event has not been processed yet
+	 * which would lead to create a second copy of the same device using its
+	 * identity address.
+	 */
+	if (cid == BT_ATT_CID)
+		device = btd_adapter_get_device(adapter, &dst, dst_type);
+	else
+		device = btd_adapter_find_device(adapter, &dst, dst_type);
+
+	if (!device) {
+		error("Unable to find device, dropping connection attempt");
+		g_io_channel_shutdown(io, FALSE, NULL);
 		return;
+	}
 
 	device_attach_att(device, io);
 }