2020-12-31 Paul Eggert <eggert@cs.ucla.edu>
+ fnmatch: merge from glibc + proposal
+ This merges the change proposed by Adhemerval Zanella in:
+ https://sourceware.org/pipermail/libc-alpha/2020-December/121212.html
+ which fixes a Gnulib bug that led to a failed assert.
+ * lib/fnmatch_loop.c (EXT): Use signed level, not unsigned, and
+ check that it stays nonnegative. Use __flexarr instead of
+ FLEXIBLE_ARRAY_MEMBER, to port better to glibc.
+ * tests/test-fnmatch.c (main): New test cases, taken from glibc.
+
glob: merge proposed glibc changes
This merges the change proposed by Adhemerval Zanella in:
https://sourceware.org/pipermail/libc-alpha/2020-December/121211.html
bool no_leading_period, int flags, size_t alloca_used)
{
const CHAR *startp;
- size_t level;
+ ptrdiff_t level;
struct patternlist
{
struct patternlist *next;
CHAR malloced;
- CHAR str[FLEXIBLE_ARRAY_MEMBER];
+ CHAR str __flexarr;
} *list = NULL;
struct patternlist **lastp = &list;
size_t pattern_len = STRLEN (pattern);
/* Parse the pattern. Store the individual parts in the list. */
level = 0;
- for (startp = p = pattern + 1; ; ++p)
+ for (startp = p = pattern + 1; level >= 0; ++p)
if (*p == L_('\0'))
{
/* This is an invalid pattern. */
*lastp = newp; \
lastp = &newp->next
NEW_PATTERN;
- break;
}
}
else if (*p == L_('|'))
*/
ASSERT (res = fnmatch ("[/b", "[/b", 0) == 0);
+ ASSERT (fnmatch ("[[:alpha:]'[:alpha:]\0]", "a", 0) == FNM_NOMATCH);
+ ASSERT (fnmatch ("[a[.\0.]]", "a", 0) == FNM_NOMATCH);
+#ifdef FNM_EXTMATCH
+ ASSERT (fnmatch ("**(!()", "**(!()", FNM_EXTMATCH) == 0);
+#endif
+#ifdef FNM_LEADING_DIR
+ ASSERT (fnmatch ("x?y", "x/y/z", FNM_PATHNAME | FNM_LEADING_DIR)
+ == FNM_NOMATCH);
+#endif
+
return 0;
}