diff options
author | Marcin Kraglak <marcin.kraglak@tieto.com> | 2014-11-06 13:47:08 +0100 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2014-11-06 17:39:13 +0200 |
commit | 877561c15420f754b4dd79322d9749ff4788907c (patch) | |
tree | e640f2497ea2477629a44612a13f046ed0167e5f | |
parent | 29d3fdcaf93bd29842028f9b6cc259ce5732d3f5 (diff) | |
download | bluez-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.c | 10 |
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) |