From 7bb2dbf3835e66203614fe9fbbe969d21335e8ea Mon Sep 17 00:00:00 2001 From: davidhubbard Date: Wed, 27 Jul 2016 17:59:58 -0700 Subject: loader: gh571 vkEnumerateInstanceLayerProperties() This fixed a memory leak. Steps to reproduce: Run valgrind --leak_check=full on a this test file: ``` int main() { uint32_t layerCount = 0; vkEnumerateInstanceLayerProperties(&layerCount, nullptr); printf("layerCount=%u\n", layerCount); return 0; } ``` valgrind output will look like: ``` ==PID== ==PID== 49,920 bytes in 6 blocks are definitely lost in loss record 57 of 58 ==PID== at 0x40307C4: malloc (vg_replace_malloc.c:270) ==PID== by 0x4A2B5F3: loader_instance_heap_alloc (loader/loader.c:178) ==PID== by 0x4A2CB0D: loader_init_generic_list (loader/loader.c:858) ==PID== by 0x4A2CBDE: loader_add_to_ext_list (loader/loader.c:889) ==PID== by 0x4A30A32: loader_read_json_layer (loader/loader.c:2311) ==PID== by 0x4A31373: loader_add_layer_properties (loader/loader.c:2509) ==PID== by 0x4A3286F: loader_layer_scan (loader/loader.c:3032) ==PID== by 0x4A38DFC: vkEnumerateInstanceLayerProperties (loader/trampoline.c:239) ==PID== ``` The fix is simple: vkEnumerateInstanceLayerProperties() in loader/trampoline.c should call loader_delete_layer_properties(), not loader_destroy_layer_list() in both places it frees resources associated with the instance_layer_list. Change-Id: I3275195dd27703c2747971288327d546efe5ed25 --- loader/trampoline.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/loader/trampoline.c b/loader/trampoline.c index 03c1c793..5d5d486e 100644 --- a/loader/trampoline.c +++ b/loader/trampoline.c @@ -156,7 +156,7 @@ vkEnumerateInstanceExtensionProperties(const char *pLayerName, loader_add_to_ext_list(NULL, &local_ext_list, ext_list->count, ext_list->list); } - loader_destroy_layer_list(NULL, NULL, &local_list); + loader_delete_layer_properties(NULL, &local_list); global_ext_list = &local_ext_list; } else { @@ -219,7 +219,7 @@ vkEnumerateInstanceExtensionProperties(const char *pLayerName, out: loader_destroy_generic_list(NULL, (struct loader_generic_list *)&local_ext_list); - loader_destroy_layer_list(NULL, NULL, &instance_layers); + loader_delete_layer_properties(NULL, &instance_layers); return res; } -- cgit v1.2.3