the FNM_PATHNAME logic for advancing by /-delimited components was
incorrect when the / character was escaped (i.e. \/), and a final \ at
the end of pattern was not handled correctly.
#include <wchar.h>
#include <wctype.h>
#include <wchar.h>
#include <wctype.h>
#define UNMATCHABLE -2
#define BRACKET -3
#define QUESTION -4
#define UNMATCHABLE -2
#define BRACKET -3
#define QUESTION -4
- if (pat[0]=='\\' && !(flags & FNM_NOESCAPE)) {
+ if (pat[0]=='\\' && pat[1] && !(flags & FNM_NOESCAPE)) {
*step = 2;
pat++;
esc = 1;
*step = 2;
pat++;
esc = 1;
if (flags & FNM_PATHNAME) for (;;) {
for (s=str; *s && *s!='/'; s++);
for (p=pat; (c=pat_next(p, -1, &inc, flags))!=END && c!='/'; p+=inc);
if (flags & FNM_PATHNAME) for (;;) {
for (s=str; *s && *s!='/'; s++);
for (p=pat; (c=pat_next(p, -1, &inc, flags))!=END && c!='/'; p+=inc);
- if (*p!=*s) return FNM_NOMATCH;
+ if (c!=*s) return FNM_NOMATCH;
if (fnmatch_internal(pat, p-pat, str, s-str, flags))
return FNM_NOMATCH;
if (!*s) return 0;
str = s+1;
if (fnmatch_internal(pat, p-pat, str, s-str, flags))
return FNM_NOMATCH;
if (!*s) return 0;
str = s+1;
}
return fnmatch_internal(pat, -1, str, -1, flags);
}
}
return fnmatch_internal(pat, -1, str, -1, flags);
}