diff options
author | Andreas Schwab <schwab@suse.de> | 2016-10-20 10:04:41 +0200 |
---|---|---|
committer | Andreas Schwab <schwab@suse.de> | 2016-10-31 12:36:08 +0100 |
commit | 44c637ce806cc41534e89117a93c41fd310e7e3f (patch) | |
tree | 5b5cd09de566e3bbdec011b97838293b0ac6a418 /posix/glob.c | |
parent | 93fe09cb5fbf68e473d5514adc069d2f6115cc23 (diff) | |
download | glibc-44c637ce806cc41534e89117a93c41fd310e7e3f.tar.gz glibc-44c637ce806cc41534e89117a93c41fd310e7e3f.tar.xz glibc-44c637ce806cc41534e89117a93c41fd310e7e3f.zip |
Properly initialize glob structure with GLOB_BRACE|GLOB_DOOFFS (bug 20707)
Diffstat (limited to 'posix/glob.c')
-rw-r--r-- | posix/glob.c | 65 |
1 files changed, 26 insertions, 39 deletions
diff --git a/posix/glob.c b/posix/glob.c index ea4b0b61eb..e357195a72 100644 --- a/posix/glob.c +++ b/posix/glob.c @@ -312,6 +312,28 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int), also makes all the code that uses gl_offs simpler. */ pglob->gl_offs = 0; + if (!(flags & GLOB_APPEND)) + { + pglob->gl_pathc = 0; + if (!(flags & GLOB_DOOFFS)) + pglob->gl_pathv = NULL; + else + { + size_t i; + + if (pglob->gl_offs >= ~((size_t) 0) / sizeof (char *)) + return GLOB_NOSPACE; + + pglob->gl_pathv = (char **) malloc ((pglob->gl_offs + 1) + * sizeof (char *)); + if (pglob->gl_pathv == NULL) + return GLOB_NOSPACE; + + for (i = 0; i <= pglob->gl_offs; ++i) + pglob->gl_pathv[i] = NULL; + } + } + if (flags & GLOB_BRACE) { const char *begin; @@ -359,14 +381,7 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int), { onealt = (char *) malloc (pattern_len); if (onealt == NULL) - { - if (!(flags & GLOB_APPEND)) - { - pglob->gl_pathc = 0; - pglob->gl_pathv = NULL; - } - return GLOB_NOSPACE; - } + return GLOB_NOSPACE; } /* We know the prefix for all sub-patterns. */ @@ -383,7 +398,8 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int), if (__glibc_unlikely (!alloca_onealt)) #endif free (onealt); - return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob); + flags &= ~GLOB_BRACE; + goto no_brace; } /* Now find the end of the whole brace expression. */ @@ -404,14 +420,6 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int), points past the final }. We will accumulate result names from recursive runs for each brace alternative in the buffer using GLOB_APPEND. */ - - if (!(flags & GLOB_APPEND)) - { - /* This call is to set a new vector, so clear out the - vector so we can append to it. */ - pglob->gl_pathc = 0; - pglob->gl_pathv = NULL; - } firstc = pglob->gl_pathc; p = begin + 1; @@ -463,28 +471,7 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int), } } - if (!(flags & GLOB_APPEND)) - { - pglob->gl_pathc = 0; - if (!(flags & GLOB_DOOFFS)) - pglob->gl_pathv = NULL; - else - { - size_t i; - - if (pglob->gl_offs >= ~((size_t) 0) / sizeof (char *)) - return GLOB_NOSPACE; - - pglob->gl_pathv = (char **) malloc ((pglob->gl_offs + 1) - * sizeof (char *)); - if (pglob->gl_pathv == NULL) - return GLOB_NOSPACE; - - for (i = 0; i <= pglob->gl_offs; ++i) - pglob->gl_pathv[i] = NULL; - } - } - + no_brace: oldcount = pglob->gl_pathc + pglob->gl_offs; /* Find the filename. */ |