summaryrefslogtreecommitdiff
path: root/lib/glob.c
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2017-04-01 15:15:18 +0200
committerBruno Haible <bruno@clisp.org>2017-04-23 12:55:44 +0200
commit1540f3441555f756558f3a18e5f68914c0b72227 (patch)
tree783bb5aba2e52170b44f2b4dfdb967ca2ba588f6 /lib/glob.c
parent4082963953caf69f053dd553eb9cb0148d56e968 (diff)
downloadgnulib-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.c19
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;