summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2023-03-13 15:51:49 -0700
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2023-03-14 12:38:19 -0700
commit4b704fb45a69ed6e745c5d01cca9622ede4bf522 (patch)
tree3a09d058c0f6c8881b623cb7ae25084c284e7361 /src
parent605ee768b789602f59f298423dfbad780deeeb8c (diff)
downloadbluez-4b704fb45a69ed6e745c5d01cca9622ede4bf522.tar.gz
shared/gatt-client: Introduce bt_gatt_client_ref_safe
This introduces bt_gatt_client_ref_save which ensures the instaces which are being destroyed, e.g. ref_count = 0, do not attempt to reach callbacks.
Diffstat (limited to 'src')
-rw-r--r--src/shared/gatt-client.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/shared/gatt-client.c b/src/shared/gatt-client.c
index f88507691..f0499cc0e 100644
--- a/src/shared/gatt-client.c
+++ b/src/shared/gatt-client.c
@@ -173,9 +173,20 @@ static bool idle_notify(const void *data, const void *user_data)
return true;
}
+static struct bt_gatt_client *
+bt_gatt_client_ref_safe(struct bt_gatt_client *client)
+{
+ if (!client || !client->ref_count)
+ return NULL;
+
+ return bt_gatt_client_ref(client);
+}
+
static void notify_client_idle(struct bt_gatt_client *client)
{
- bt_gatt_client_ref(client);
+ client = bt_gatt_client_ref_safe(client);
+ if (!client)
+ return;
queue_remove_all(client->idle_cbs, idle_notify, NULL, idle_destroy);
@@ -1360,10 +1371,13 @@ static void notify_client_ready(struct bt_gatt_client *client, bool success,
{
const struct queue_entry *entry;
- if (client->ready)
+ client = bt_gatt_client_ref_safe(client);
+ if (!client)
return;
- bt_gatt_client_ref(client);
+ if (client->ready)
+ goto done;
+
client->ready = success;
if (client->parent)
@@ -1386,6 +1400,7 @@ static void notify_client_ready(struct bt_gatt_client *client, bool success,
notify_client_ready(clone, success, att_ecode);
}
+done:
bt_gatt_client_unref(client);
}