From 351727917b49ddd9e5b7924e8cb7d95c126e4200 Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Tue, 8 Jan 2002 09:00:17 +0000 Subject: Scrub malloc handling --- libc/misc/dirent/scandir.c | 20 ++++++++++++-------- libc/misc/dirent/scandir64.c | 21 +++++++++++++-------- 2 files changed, 25 insertions(+), 16 deletions(-) (limited to 'libc/misc/dirent') diff --git a/libc/misc/dirent/scandir.c b/libc/misc/dirent/scandir.c index a460e161f..1b4d7ec6d 100644 --- a/libc/misc/dirent/scandir.c +++ b/libc/misc/dirent/scandir.c @@ -30,11 +30,6 @@ #include #include "dirstream.h" -/* - * FIXME: This is a simple hack version which doesn't sort the data, and - * just passes all unsorted. - */ - int scandir(const char *dir, struct dirent ***namelist, int (*selector) (const struct dirent *), int (*compar) (const __ptr_t, const __ptr_t)) @@ -52,7 +47,10 @@ int scandir(const char *dir, struct dirent ***namelist, while (NULL != readdir(d)) count++; - names = malloc(sizeof (struct dirent *) * count); + if (!(names = malloc(sizeof (struct dirent *) * count))) { + closedir(d); + return -1; + } rewinddir(d); @@ -68,8 +66,14 @@ int scandir(const char *dir, struct dirent ***namelist, } result = closedir(d); - if (pos != count) - names = realloc(names, sizeof (struct dirent *) * pos); + if (pos != count) { + struct dirent **tmp; + if (!(tmp = realloc(names, sizeof (struct dirent *) * pos))) { + free(names); + return -1; + } + names = tmp; + } if (compar != NULL) { qsort(names, pos, sizeof (struct dirent *), compar); diff --git a/libc/misc/dirent/scandir64.c b/libc/misc/dirent/scandir64.c index 6c6697b42..12752db72 100644 --- a/libc/misc/dirent/scandir64.c +++ b/libc/misc/dirent/scandir64.c @@ -36,11 +36,6 @@ #include "dirstream.h" -/* - * FIXME: This is a simple hack version which doesn't sort the data, and - * just passes all unsorted. - */ - int scandir64(const char *dir, struct dirent64 ***namelist, int (*selector) (const struct dirent64 *), int (*compar) (const __ptr_t, const __ptr_t)) @@ -58,7 +53,10 @@ int scandir64(const char *dir, struct dirent64 ***namelist, while (NULL != readdir64(d)) count++; - names = malloc(sizeof (struct dirent64 *) * count); + if (!(names = malloc(sizeof (struct dirent64 *) * count))) { + closedir(d); + return -1; + } rewinddir(d); @@ -74,8 +72,15 @@ int scandir64(const char *dir, struct dirent64 ***namelist, } result = closedir(d); - if (pos != count) - names = realloc(names, sizeof (struct dirent64 *) * pos); + if (pos != count) { + struct dirent64 **tmp; + if (!(tmp = realloc(names, sizeof (struct dirent64 *) * pos))) { + free(names); + return -1; + } + names = tmp; + } + if (compar != NULL) { qsort(names, pos, sizeof (struct dirent64 *), compar); -- cgit v1.2.3