mirror of
https://xff.cz/git/u-boot/
synced 2025-09-02 01:02:19 +02:00
sandbox: avoid memory leak in os_dirent_ls
Realloc does not free the old memory area if it fails. Identified by cppcheck. Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
committed by
Simon Glass
parent
68a345294a
commit
04d0da5157
@@ -319,6 +319,7 @@ int os_dirent_ls(const char *dirname, struct os_dirent_node **headp)
|
|||||||
DIR *dir;
|
DIR *dir;
|
||||||
int ret;
|
int ret;
|
||||||
char *fname;
|
char *fname;
|
||||||
|
char *old_fname;
|
||||||
int len;
|
int len;
|
||||||
int dirlen;
|
int dirlen;
|
||||||
|
|
||||||
@@ -344,16 +345,23 @@ int os_dirent_ls(const char *dirname, struct os_dirent_node **headp)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
next = malloc(sizeof(*node) + strlen(entry->d_name) + 1);
|
next = malloc(sizeof(*node) + strlen(entry->d_name) + 1);
|
||||||
|
if (!next) {
|
||||||
|
os_dirent_free(head);
|
||||||
|
ret = -ENOMEM;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
if (dirlen + strlen(entry->d_name) > len) {
|
if (dirlen + strlen(entry->d_name) > len) {
|
||||||
len = dirlen + strlen(entry->d_name);
|
len = dirlen + strlen(entry->d_name);
|
||||||
|
old_fname = fname;
|
||||||
fname = realloc(fname, len);
|
fname = realloc(fname, len);
|
||||||
}
|
if (!fname) {
|
||||||
if (!next || !fname) {
|
free(old_fname);
|
||||||
free(next);
|
free(next);
|
||||||
os_dirent_free(head);
|
os_dirent_free(head);
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
next->next = NULL;
|
next->next = NULL;
|
||||||
strcpy(next->name, entry->d_name);
|
strcpy(next->name, entry->d_name);
|
||||||
switch (entry->d_type) {
|
switch (entry->d_type) {
|
||||||
|
Reference in New Issue
Block a user