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. --- src/shared/gatt-client.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/shared/gatt-client.c b/src/shared/gatt-client.c index 8689368..b4f28b2 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) -- 1.9.3 -- To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html