Don't read past end of pattern in fnmatch (BZ #17062)

This commit is contained in:
Andreas Schwab 2014-06-18 11:58:45 +02:00
parent 85d8927856
commit b3a9f56ba5
5 changed files with 44 additions and 12 deletions

View File

@ -1,3 +1,11 @@
2014-06-18 Andreas Schwab <schwab@suse.de>
[BZ #17062]
* posix/fnmatch_loop.c (FCT): Rerrange loop for skipping over rest
of a bracket expr not to run off the end of the string.
* posix/Makefile (tests): Add tst-fnmatch3.
* posix/tst-fnmatch3.c: New file.
2014-06-18 Joseph Myers <joseph@codesourcery.com>
* elf/Makefile ($(objpfx)tst-unused-dep.out): Use $(rtld-prefix).

2
NEWS
View File

@ -20,7 +20,7 @@ Version 2.20
16854, 16876, 16877, 16878, 16882, 16885, 16888, 16890, 16912, 16915,
16916, 16917, 16922, 16927, 16928, 16932, 16943, 16958, 16965, 16966,
16967, 16977, 16978, 16984, 16990, 16996, 17009, 17031, 17042, 17048,
17058.
17058, 17062.
* The minimum Linux kernel version that this version of the GNU C Library
can be used with is 2.6.32.

View File

@ -86,7 +86,8 @@ tests := tstgetopt testfnm runtests runptests \
tst-getaddrinfo3 tst-fnmatch2 tst-cpucount tst-cpuset \
bug-getopt1 bug-getopt2 bug-getopt3 bug-getopt4 \
bug-getopt5 tst-getopt_long1 bug-regex34 bug-regex35 \
tst-pathconf tst-getaddrinfo4 tst-rxspencer-no-utf8
tst-pathconf tst-getaddrinfo4 tst-rxspencer-no-utf8 \
tst-fnmatch3
xtests := bug-ga2
ifeq (yes,$(build-shared))
test-srcs := globtest

View File

@ -899,11 +899,8 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used)
matched:
/* Skip the rest of the [...] that already matched. */
do
while ((c = *p++) != L (']'))
{
ignore_next:
c = *p++;
if (c == L('\0'))
/* [... (unterminated) loses. */
return FNM_NOMATCH;
@ -931,12 +928,11 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used)
if (c < L('a') || c >= L('z'))
{
p = startp;
goto ignore_next;
p = startp - 2;
break;
}
}
p += 2;
c = *p++;
}
else if (c == L('[') && *p == L('='))
{
@ -947,7 +943,6 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used)
if (c != L('=') || p[1] != L(']'))
return FNM_NOMATCH;
p += 2;
c = *p++;
}
else if (c == L('[') && *p == L('.'))
{
@ -962,10 +957,8 @@ FCT (pattern, string, string_end, no_leading_period, flags, ends, alloca_used)
break;
}
p += 2;
c = *p++;
}
}
while (c != L(']'));
if (not)
return FNM_NOMATCH;
}

30
posix/tst-fnmatch3.c Normal file
View File

@ -0,0 +1,30 @@
/* Test for fnmatch not reading past the end of the pattern.
Copyright (C) 2014 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <fnmatch.h>
int
do_test (void)
{
const char *pattern = "[[:alpha:]'[:alpha:]\0]";
return fnmatch (pattern, "a", 0) != FNM_NOMATCH;
}
#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"