From 81435af3be9de47fd74dff0c5e0a6add7c66ae9b Mon Sep 17 00:00:00 2001 From: Ruediger Meier Date: Tue, 27 Jun 2017 20:33:18 +0200 Subject: lsmem: fix, using freed memory Simply avoiding strdup(). Error handling improved. This was the Clang Analyzer warning: Memory Error, Use-after-free sys-utils/lsmem.c:259:3: warning: Use of memory after it is freed err(EXIT_FAILURE, _("Failed to open %s"), path); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Signed-off-by: Ruediger Meier --- sys-utils/lsmem.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) (limited to 'sys-utils/lsmem.c') diff --git a/sys-utils/lsmem.c b/sys-utils/lsmem.c index e1ee5a5ce..4db678966 100644 --- a/sys-utils/lsmem.c +++ b/sys-utils/lsmem.c @@ -248,15 +248,14 @@ static void print_summary(struct lsmem *lsmem) static int memory_block_get_node(char *name) { struct dirent *de; - char *path; + const char *path; DIR *dir; int node; - path = path_strdup(_PATH_SYS_MEMORY"/%s", name); - dir = opendir(path); - free(path); - if (!dir) - err(EXIT_FAILURE, _("Failed to open %s"), path); + path = path_get(_PATH_SYS_MEMORY"/%s", name); + if (!path || !(dir= opendir(path))) + err(EXIT_FAILURE, _("Failed to open %s"), path ? path : name); + node = -1; while ((de = readdir(dir)) != NULL) { if (strncmp("node", de->d_name, 4)) @@ -348,14 +347,16 @@ static int memory_block_filter(const struct dirent *de) static void read_basic_info(struct lsmem *lsmem) { - char *dir; + const char *dir; if (!path_exist(_PATH_SYS_MEMORY_BLOCK_SIZE)) errx(EXIT_FAILURE, _("This system does not support memory blocks")); - dir = path_strdup(_PATH_SYS_MEMORY); + dir = path_get(_PATH_SYS_MEMORY); + if (!dir) + err(EXIT_FAILURE, _("Failed to read %s"), _PATH_SYS_MEMORY); + lsmem->ndirs = scandir(dir, &lsmem->dirs, memory_block_filter, versionsort); - free(dir); if (lsmem->ndirs <= 0) err(EXIT_FAILURE, _("Failed to read %s"), _PATH_SYS_MEMORY); -- cgit v1.2.3-55-g7522