This is the mail archive of the
glibc-cvs@sourceware.org
mailing list for the glibc project.
GNU C Library master sources branch master updated. glibc-2.24-322-g44c637c
- From: schwab at sourceware dot org
- To: glibc-cvs at sourceware dot org
- Date: 31 Oct 2016 11:38:01 -0000
- Subject: GNU C Library master sources branch master updated. glibc-2.24-322-g44c637c
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".
The branch, master has been updated
via 44c637ce806cc41534e89117a93c41fd310e7e3f (commit)
from 93fe09cb5fbf68e473d5514adc069d2f6115cc23 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=44c637ce806cc41534e89117a93c41fd310e7e3f
commit 44c637ce806cc41534e89117a93c41fd310e7e3f
Author: Andreas Schwab <schwab@suse.de>
Date: Thu Oct 20 10:04:41 2016 +0200
Properly initialize glob structure with GLOB_BRACE|GLOB_DOOFFS (bug 20707)
diff --git a/ChangeLog b/ChangeLog
index 8cfa6e9..e6d3121 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2016-10-31 Andreas Schwab <schwab@suse.de>
+
+ [BZ #20707]
+ * posix/glob.c (glob): Initialize pglob before checking for
+ GLOB_BRACE. Don't call glob recursively if pattern contains no
+ valid brace expression despite GLOB_BRACE.
+ * posix/globtest.sh: Test it.
+
2016-10-28 Carlos O'Donell <carlos@redhat.com>
[BZ #20729]
diff --git a/posix/glob.c b/posix/glob.c
index ea4b0b6..e357195 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. */
diff --git a/posix/globtest.sh b/posix/globtest.sh
index 73fe11b..e280f7d 100755
--- a/posix/globtest.sh
+++ b/posix/globtest.sh
@@ -794,6 +794,22 @@ if test $failed -ne 0; then
result=1
fi
+# Test GLOB_BRACE and GLIB_DOOFFS with malloc checking
+failed=0
+${test_wrapper_env} \
+MALLOC_PERTURB_=65 \
+${test_via_rtld_prefix} \
+${common_objpfx}posix/globtest -b -o "$testdir" "file{1,2}" > $testout || failed=1
+cat <<"EOF" | $CMP - $testout >> $logfile || failed=1
+`abc'
+`file1'
+`file2'
+EOF
+if test $failed -ne 0; then
+ echo "GLOB_BRACE+GLOB_DOOFFS test failed" >> $logfile
+ result=1
+fi
+
if test $result -eq 0; then
chmod 777 $testdir/noread
rm -fr $testdir $testout
-----------------------------------------------------------------------
Summary of changes:
ChangeLog | 8 ++++++
posix/glob.c | 65 +++++++++++++++++++++-------------------------------
posix/globtest.sh | 16 +++++++++++++
3 files changed, 50 insertions(+), 39 deletions(-)
hooks/post-receive
--
GNU C Library master sources