From dbbb73968ec9af48c2b0b9ea65a4b03843109f7d Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Mon, 17 May 2021 08:40:17 -0400 Subject: [PATCH] Fix: handle leak in abi tests Coverity finds that dlopen_ust leaks handles. Modify the code structure to keep track of those handles in library descriptors so they are not leaked. *** CID 1453155: (RESOURCE_LEAK) /tests/regression/abi0-conflict/app_ust_dlopen.c: 35 in dlopen_ust() 29 printf("Error: dlopen of liblttng-ust shared library (%s).\n", lib_soname); 30 ret = EXIT_FAILURE; 31 } else { 32 printf("Success: dlopen of liblttng-ust shared library (%s).\n", lib_soname); 33 } 34 >>> CID 1453155: (RESOURCE_LEAK) >>> Variable "handle" going out of scope leaks the storage it points to. 35 return ret; 36 } 37 38 static 39 int dlopen_abi0(void) 40 { /tests/regression/abi0-conflict/app_noust_dlopen.c: 31 in dlopen_ust() 25 printf("Error: dlopen of liblttng-ust shared library (%s).\n", lib_soname); 26 ret = EXIT_FAILURE; 27 } else { 28 printf("Success: dlopen of liblttng-ust shared library (%s).\n", lib_soname); 29 } 30 >>> CID 1453155: (RESOURCE_LEAK) >>> Variable "handle" going out of scope leaks the storage it points to. 31 return ret; 32 } 33 34 static 35 int dlopen_abi0(void) 36 { Signed-off-by: Mathieu Desnoyers Change-Id: I967c2e8741c6d42c0c12e19fbadc81e1c91d1e0f --- .../abi0-conflict/app_noust_dlopen.c | 44 ++++++++++++------ .../regression/abi0-conflict/app_ust_dlopen.c | 46 ++++++++++++------- 2 files changed, 60 insertions(+), 30 deletions(-) diff --git a/tests/regression/abi0-conflict/app_noust_dlopen.c b/tests/regression/abi0-conflict/app_noust_dlopen.c index 9a52bc79..e0519c81 100644 --- a/tests/regression/abi0-conflict/app_noust_dlopen.c +++ b/tests/regression/abi0-conflict/app_noust_dlopen.c @@ -14,18 +14,34 @@ #define LTTNG_UST_LIB_ABI0_SO_NAME "libfakeust0.so" #define LTTNG_UST_LIB_ABI1_SO_NAME "liblttng-ust.so.1" +struct lib_desc { + const char *soname; + void *handle; +}; + +static struct lib_desc lib_desc[] = { + [0] = { + .soname = LTTNG_UST_LIB_ABI0_SO_NAME, + }, + [1] = { + .soname = LTTNG_UST_LIB_ABI1_SO_NAME, + }, + [2] = { + .soname = LTTNG_UST_LIB_ABI1_SO_NAME, + }, +}; + static -int dlopen_ust(const char *lib_soname) +int dlopen_ust(struct lib_desc *desc) { int ret = EXIT_SUCCESS; - void *handle; - handle = dlopen(lib_soname, RTLD_NOW | RTLD_GLOBAL); - if (!handle) { - printf("Error: dlopen of liblttng-ust shared library (%s).\n", lib_soname); + desc->handle = dlopen(desc->soname, RTLD_NOW | RTLD_GLOBAL); + if (!desc->handle) { + printf("Error: dlopen of liblttng-ust shared library (%s).\n", desc->soname); ret = EXIT_FAILURE; } else { - printf("Success: dlopen of liblttng-ust shared library (%s).\n", lib_soname); + printf("Success: dlopen of liblttng-ust shared library (%s).\n", desc->soname); } return ret; @@ -34,13 +50,13 @@ int dlopen_ust(const char *lib_soname) static int dlopen_abi0(void) { - return dlopen_ust(LTTNG_UST_LIB_ABI0_SO_NAME); + return dlopen_ust(&lib_desc[0]); } static int dlopen_abi1(void) { - return dlopen_ust(LTTNG_UST_LIB_ABI1_SO_NAME); + return dlopen_ust(&lib_desc[1]); } static @@ -48,11 +64,11 @@ int dlopen_abi0_abi1(void) { int ret = EXIT_SUCCESS; - ret = dlopen_ust(LTTNG_UST_LIB_ABI0_SO_NAME); + ret = dlopen_ust(&lib_desc[0]); if (ret != EXIT_SUCCESS) return ret; - ret = dlopen_ust(LTTNG_UST_LIB_ABI1_SO_NAME); + ret = dlopen_ust(&lib_desc[1]); return ret; } @@ -62,11 +78,11 @@ int dlopen_abi1_abi0(void) { int ret = EXIT_SUCCESS; - ret = dlopen_ust(LTTNG_UST_LIB_ABI1_SO_NAME); + ret = dlopen_ust(&lib_desc[1]); if (ret != EXIT_SUCCESS) return ret; - ret = dlopen_ust(LTTNG_UST_LIB_ABI0_SO_NAME); + ret = dlopen_ust(&lib_desc[0]); return ret; } @@ -76,11 +92,11 @@ int dlopen_abi1_abi1(void) { int ret = EXIT_SUCCESS; - ret = dlopen_ust(LTTNG_UST_LIB_ABI1_SO_NAME); + ret = dlopen_ust(&lib_desc[1]); if (ret != EXIT_SUCCESS) return ret; - ret = dlopen_ust(LTTNG_UST_LIB_ABI1_SO_NAME); + ret = dlopen_ust(&lib_desc[2]); return ret; } diff --git a/tests/regression/abi0-conflict/app_ust_dlopen.c b/tests/regression/abi0-conflict/app_ust_dlopen.c index ad9d1b29..fe7fccc7 100644 --- a/tests/regression/abi0-conflict/app_ust_dlopen.c +++ b/tests/regression/abi0-conflict/app_ust_dlopen.c @@ -18,18 +18,34 @@ #define LTTNG_UST_LIB_ABI0_SO_NAME "libfakeust0.so" #define LTTNG_UST_LIB_ABI1_SO_NAME "liblttng-ust.so.1" +struct lib_desc { + const char *soname; + void *handle; +}; + +static struct lib_desc lib_desc[] = { + [0] = { + .soname = LTTNG_UST_LIB_ABI0_SO_NAME, + }, + [1] = { + .soname = LTTNG_UST_LIB_ABI1_SO_NAME, + }, + [2] = { + .soname = LTTNG_UST_LIB_ABI1_SO_NAME, + }, +}; + static -int dlopen_ust(const char *lib_soname) +int dlopen_ust(struct lib_desc *desc) { int ret = EXIT_SUCCESS; - void *handle; - handle = dlopen(lib_soname, RTLD_NOW | RTLD_GLOBAL); - if (!handle) { - printf("Error: dlopen of liblttng-ust shared library (%s).\n", lib_soname); + desc->handle = dlopen(desc->soname, RTLD_NOW | RTLD_GLOBAL); + if (!desc->handle) { + printf("Error: dlopen of liblttng-ust shared library (%s).\n", desc->soname); ret = EXIT_FAILURE; } else { - printf("Success: dlopen of liblttng-ust shared library (%s).\n", lib_soname); + printf("Success: dlopen of liblttng-ust shared library (%s).\n", desc->soname); } return ret; @@ -38,13 +54,13 @@ int dlopen_ust(const char *lib_soname) static int dlopen_abi0(void) { - return dlopen_ust(LTTNG_UST_LIB_ABI0_SO_NAME); + return dlopen_ust(&lib_desc[0]); } static int dlopen_abi1(void) { - return dlopen_ust(LTTNG_UST_LIB_ABI1_SO_NAME); + return dlopen_ust(&lib_desc[1]); } static @@ -52,11 +68,11 @@ int dlopen_abi0_abi1(void) { int ret = EXIT_SUCCESS; - ret = dlopen_ust(LTTNG_UST_LIB_ABI0_SO_NAME); + ret = dlopen_ust(&lib_desc[0]); if (ret != EXIT_SUCCESS) return ret; - ret = dlopen_ust(LTTNG_UST_LIB_ABI1_SO_NAME); + ret = dlopen_ust(&lib_desc[1]); return ret; } @@ -66,11 +82,11 @@ int dlopen_abi1_abi0(void) { int ret = EXIT_SUCCESS; - ret = dlopen_ust(LTTNG_UST_LIB_ABI1_SO_NAME); + ret = dlopen_ust(&lib_desc[1]); if (ret != EXIT_SUCCESS) return ret; - ret = dlopen_ust(LTTNG_UST_LIB_ABI0_SO_NAME); + ret = dlopen_ust(&lib_desc[0]); return ret; } @@ -80,11 +96,11 @@ int dlopen_abi1_abi1(void) { int ret = EXIT_SUCCESS; - ret = dlopen_ust(LTTNG_UST_LIB_ABI1_SO_NAME); + ret = dlopen_ust(&lib_desc[1]); if (ret != EXIT_SUCCESS) return ret; - ret = dlopen_ust(LTTNG_UST_LIB_ABI1_SO_NAME); + ret = dlopen_ust(&lib_desc[2]); return ret; } @@ -100,7 +116,6 @@ int main(int argc, char **argv) { int ret = EXIT_SUCCESS; const char *test_type; - int i, netint; long values[] = { 1, 2, 3 }; char text[10] = "test"; @@ -108,7 +123,6 @@ int main(int argc, char **argv) float flt = 2222.0; bool mybool = 123; /* should print "1" */ - if (argc != 2) { usage(argv); return EXIT_FAILURE; -- 2.34.1