summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcin Kraglak <marcin.kraglak@tieto.com>2014-11-06 13:47:08 +0100
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2014-11-06 17:39:13 +0200
commit877561c15420f754b4dd79322d9749ff4788907c (patch)
treee640f2497ea2477629a44612a13f046ed0167e5f
parent29d3fdcaf93bd29842028f9b6cc259ce5732d3f5 (diff)
downloadbluez-877561c15420f754b4dd79322d9749ff4788907c.tar.gz
shared/gatt: Fix memory leak in discovery_op_unref
Free services list in discovery_op_unref. If discovery has been interrupted, services from discovery_op were not pushed to gatt_client service list, and it caused memory leak.
-rw-r--r--src/shared/gatt-client.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/shared/gatt-client.c b/src/shared/gatt-client.c
index 868936827..b4f28b281 100644
--- a/src/shared/gatt-client.c
+++ b/src/shared/gatt-client.c
@@ -411,6 +411,8 @@ static void discovery_op_unref(void *data)
if (__sync_sub_and_fetch(&op->ref_count, 1))
return;
+ service_list_clear(&op->result_head, &op->result_tail);
+
free(data);
}
@@ -1140,6 +1142,10 @@ static void init_complete(struct discovery_op *op, bool success,
client->svc_head = op->result_head;
client->svc_tail = op->result_tail;
+ /* Change owner of service list */
+ op->result_head = NULL;
+ op->result_tail = NULL;
+
if (!client->svc_chngd_val_handle) {
client->ready = true;
goto done;
@@ -1164,12 +1170,10 @@ static void init_complete(struct discovery_op *op, bool success,
util_debug(client->debug_callback, client->debug_data,
"Failed to register handler for \"Service Changed\"");
- client->svc_head = client->svc_tail = NULL;
-
fail:
util_debug(client->debug_callback, client->debug_data,
"Failed to initialize gatt-client");
- service_list_clear(&op->result_head, &op->result_tail);
+ service_list_clear(&client->svc_head, &client->svc_head);
done:
if (client->ready_callback)