diff mbox series

[BlueZ,v4,2/2] shared/gatt-client: Fix not removing pending services

Message ID 20221217011059.3087848-2-luiz.dentz@gmail.com (mailing list archive)
State Accepted
Commit da203f5dbc7edaa15b55d1efcea3fda5e43cfc2e
Headers show
Series [BlueZ,v4,1/2] shared/gatt-db: Add gatt_db_attribute_get_service | expand

Checks

Context Check Description
tedd_an/pre-ci_am success Success
tedd_an/CheckPatch success CheckPatch PASS
tedd_an/GitLint success Gitlint PASS
tedd_an/IncrementalBuild success Incremental Build PASS

Commit Message

Luiz Augusto von Dentz Dec. 17, 2022, 1:10 a.m. UTC
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

If there are no characteristics to discover, or for some reason
bt_gatt_discover_descriptors is skiped, or the last attribute is
actually a included service the service should be removed from
pending list as there will be no more attributes to be discovered.

Fixes: https://github.com/bluez/bluez/issues/438
---
 src/shared/gatt-client.c | 46 +++++++++++++++++++++++++++++++---------
 1 file changed, 36 insertions(+), 10 deletions(-)
diff mbox series

Patch

diff --git a/src/shared/gatt-client.c b/src/shared/gatt-client.c
index cf0d2e2b749d..cb2e64b6cc6b 100644
--- a/src/shared/gatt-client.c
+++ b/src/shared/gatt-client.c
@@ -500,6 +500,24 @@  static void discovery_req_clear(struct bt_gatt_client *client)
 	client->discovery_req = NULL;
 }
 
+static void discover_remove_pending(struct discovery_op *op,
+					struct gatt_db_attribute *attr)
+{
+	struct gatt_db_attribute *svc;
+
+	svc = gatt_db_attribute_get_service(attr);
+	if (!svc)
+		return;
+
+	if (!queue_remove(op->pending_svcs, svc))
+		return;
+
+	gatt_db_service_set_active(svc, true);
+
+	if (op->cur_svc == svc)
+		op->cur_svc = NULL;
+}
+
 static void discover_chrcs_cb(bool success, uint8_t att_ecode,
 						struct bt_gatt_result *result,
 						void *user_data);
@@ -576,12 +594,26 @@  static void discover_incl_cb(bool success, uint8_t att_ecode,
 				gatt_db_attribute_get_handle(attr), handle);
 			goto failed;
 		}
+
+		if (!gatt_db_attribute_get_service_data(attr, NULL, &end,
+							NULL, NULL)) {
+			DBG(client, "Unable to get service data at 0x%04x",
+								handle);
+			goto failed;
+		}
+
+		/* Skip if there are no attributes */
+		if (handle == end)
+			discover_remove_pending(op, attr);
 	}
 
 next:
 	range = queue_pop_head(op->discov_ranges);
-	if (!range)
+	if (!range) {
+		/* Skip if there are no attributes */
+		discover_remove_pending(op, op->cur_svc);
 		goto failed;
+	}
 
 	client->discovery_req = bt_gatt_discover_characteristics(client->att,
 							range->start,
@@ -725,6 +757,9 @@  static bool discover_descs(struct discovery_op *op, bool *discovering)
 		goto failed;
 	}
 
+	/* Done with the current service */
+	discover_remove_pending(op, op->cur_svc);
+
 done:
 	free(chrc_data);
 	return true;
@@ -798,9 +833,6 @@  static void ext_prop_read_cb(bool success, uint8_t att_ecode,
 	if (discovering)
 		return;
 
-	/* Done with the current service */
-	gatt_db_service_set_active(op->cur_svc, true);
-
 	goto done;
 
 failed:
@@ -888,9 +920,6 @@  next:
 	if (discovering)
 		return;
 
-	/* Done with the current service */
-	gatt_db_service_set_active(op->cur_svc, true);
-
 	goto done;
 
 failed:
@@ -997,9 +1026,6 @@  next:
 	if (discovering)
 		return;
 
-	/* Done with the current service */
-	gatt_db_service_set_active(op->cur_svc, true);
-
 	goto done;
 
 failed: