summaryrefslogtreecommitdiffstats
path: root/sys-utils/lsmem.c
diff options
context:
space:
mode:
authorRuediger Meier2017-06-27 20:33:18 +0200
committerRuediger Meier2017-06-29 14:04:18 +0200
commit81435af3be9de47fd74dff0c5e0a6add7c66ae9b (patch)
treeeb8d1997190d07201724088034d75b0233e9d9d6 /sys-utils/lsmem.c
parentlib/path: add error handling to path_vcreate() (diff)
downloadkernel-qcow2-util-linux-81435af3be9de47fd74dff0c5e0a6add7c66ae9b.tar.gz
kernel-qcow2-util-linux-81435af3be9de47fd74dff0c5e0a6add7c66ae9b.tar.xz
kernel-qcow2-util-linux-81435af3be9de47fd74dff0c5e0a6add7c66ae9b.zip
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 <ruediger.meier@ga-group.nl>
Diffstat (limited to 'sys-utils/lsmem.c')
-rw-r--r--sys-utils/lsmem.c19
1 files changed, 10 insertions, 9 deletions
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);