The local variables are unneeded - you can simply advance the 'pathname' pointer. IMHO, the variable 'name' is somewhat confusing. It is a relative path to 'base', not a file name. It may contain slashes. Signed-off-by: Masahiro Yamada <masahiroy@xxxxxxxxxx> --- dir.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/dir.c b/dir.c index 4e99f0c868..06c6e7d79e 100644 --- a/dir.c +++ b/dir.c @@ -1251,9 +1251,6 @@ int match_pathname(const char *pathname, int pathlen, const char *base, int baselen, const char *pattern, int prefix, int patternlen) { - const char *name; - int namelen; - /* * match with FNM_PATHNAME; the pattern has base implicitly * in front of it. @@ -1273,35 +1270,37 @@ int match_pathname(const char *pathname, int pathlen, fspathncmp(pathname, base, baselen)) return 0; - namelen = baselen ? pathlen - baselen - 1 : pathlen; - name = pathname + pathlen - namelen; + if (baselen > 0) { + pathname += baselen + 1; + pathlen -= baselen + 1; + } if (prefix) { /* * if the non-wildcard part is longer than the * remaining pathname, surely it cannot match. */ - if (prefix > namelen) + if (prefix > pathlen) return 0; - if (fspathncmp(pattern, name, prefix)) + if (fspathncmp(pattern, pathname, prefix)) return 0; pattern += prefix; patternlen -= prefix; - name += prefix; - namelen -= prefix; + pathname += prefix; + pathlen -= prefix; /* * If the whole pattern did not have a wildcard, * then our prefix match is all we need; we * do not need to call fnmatch at all. */ - if (!patternlen && !namelen) + if (!patternlen && !pathlen) return 1; } return fnmatch_icase_mem(pattern, patternlen, - name, namelen, + pathname, pathlen, WM_PATHNAME) == 0; } -- 2.34.1