Diff between 99d34b8ceb3e577e73f510ce7bda0c9af37f9526 and f179ff75b79376a45aaf87acffc38ef0dc05801a

Changed Files

File Additions Deletions Status
src/adapter.c +30 -13 modified

Full Patch

diff --git a/src/adapter.c b/src/adapter.c
index a6364e2..c9cc476 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -3961,14 +3961,7 @@ static void update_found_devices(struct btd_adapter *adapter,
 	struct eir_data eir_data;
 	char addr[18];
 	int err;
-	GSList *l;
-
-	/*
-	 * If no client has requested discovery, then also do not send
-	 * out signals for new devices.
-	 */
-	if (!adapter->discovery_list)
-		return;
+	GSList *list;
 
 	memset(&eir_data, 0, sizeof(eir_data));
 	err = eir_parse(&eir_data, data, data_len);
@@ -3990,12 +3983,20 @@ static void update_found_devices(struct btd_adapter *adapter,
 
 	ba2str(bdaddr, addr);
 
-	l = g_slist_find_custom(adapter->devices, bdaddr,
-					(GCompareFunc) device_bdaddr_cmp);
-	if (l)
-		dev = l->data;
-	else
+	list = g_slist_find_custom(adapter->devices, bdaddr, device_bdaddr_cmp);
+	if (!list) {
+		/*
+		 * If no client has requested discovery, then do not
+		 * create new device objects.
+		 */
+		if (!adapter->discovery_list) {
+			eir_data_free(&eir_data);
+			return;
+		}
+
 		dev = adapter_create_device(adapter, addr, bdaddr_type);
+	} else
+		dev = list->data;
 
 	if (!dev) {
 		error("Unable to create object for found device %s", addr);
@@ -4003,6 +4004,15 @@ static void update_found_devices(struct btd_adapter *adapter,
 		return;
 	}
 
+	/*
+	 * If no client has requested discovery, then only update
+	 * already paired devices (skip temporary ones).
+	 */
+	if (device_is_temporary(dev) && !adapter->discovery_list) {
+		eir_data_free(&eir_data);
+		return;
+	}
+
 	device_set_legacy(dev, legacy);
 	device_set_rssi(dev, rssi);
 
@@ -4019,6 +4029,13 @@ static void update_found_devices(struct btd_adapter *adapter,
 
 	eir_data_free(&eir_data);
 
+	/*
+	 * Only if at least one client has requested discovery, maintain
+	 * list of found devices and name confirming for legacy devices.
+	 */
+	if (!adapter->discovery_list)
+		return;
+
 	if (g_slist_find(adapter->discovery_found, dev))
 		return;