diff options
author | Bruno Haible <bruno@clisp.org> | 2017-04-01 15:15:18 +0200 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2017-04-23 12:55:44 +0200 |
commit | 1540f3441555f756558f3a18e5f68914c0b72227 (patch) | |
tree | 783bb5aba2e52170b44f2b4dfdb967ca2ba588f6 /lib/glob.c | |
parent | 4082963953caf69f053dd553eb9cb0148d56e968 (diff) | |
download | gnulib-1540f3441555f756558f3a18e5f68914c0b72227.tar.gz |
glob: Fix more memory leaks.
* lib/glob.c (glob): Free allocated memory before returning.
Reported by Coverity via Tim Rühsen.
Diffstat (limited to 'lib/glob.c')
-rw-r--r-- | lib/glob.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/lib/glob.c b/lib/glob.c index 93050389cd..d4fdc1737b 100644 --- a/lib/glob.c +++ b/lib/glob.c @@ -726,6 +726,8 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int), pwtmpbuf = malloc (pwbuflen); if (pwtmpbuf == NULL) { + if (__glibc_unlikely (malloc_name)) + free (name); retval = GLOB_NOSPACE; goto out; } @@ -754,6 +756,8 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int), if (newp == NULL) { free (malloc_pwtmpbuf); + if (__glibc_unlikely (malloc_name)) + free (name); retval = GLOB_NOSPACE; goto out; } @@ -801,10 +805,10 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int), } if (home_dir == NULL || home_dir[0] == '\0') { + if (__glibc_unlikely (malloc_home_dir)) + free (home_dir); if (flags & GLOB_TILDE_CHECK) { - if (__glibc_unlikely (malloc_home_dir)) - free (home_dir); retval = GLOB_NOMATCH; goto out; } @@ -1084,9 +1088,14 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int), } else { - pglob->gl_pathv[newcount] = strdup (dirname); - if (pglob->gl_pathv[newcount] == NULL) - goto nospace; + if (__glibc_unlikely (malloc_dirname)) + pglob->gl_pathv[newcount] = dirname; + else + { + pglob->gl_pathv[newcount] = strdup (dirname); + if (pglob->gl_pathv[newcount] == NULL) + goto nospace; + } } pglob->gl_pathv[++newcount] = NULL; ++pglob->gl_pathc; |