Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> writes: > @@ -690,16 +689,18 @@ static int path_matches(const char *pathname, int pathlen, > * contain the trailing slash > */ > > - if (pathlen < baselen || > + if (pathlen < baselen + 1 || > (baselen && pathname[baselen] != '/') || > - strncmp(pathname, base, baselen)) > + strncmp_icase(pathname, base, baselen)) Shouldn't the last comparison be strncmp_icase(pathname, base, baselen + 1) instead, if you are trying to match this part from dir.c where baselen does count the trailing slash? if (pathlen < x->baselen || (x->baselen && pathname[x->baselen-1] != '/') || strncmp_icase(pathname, x->base, x->baselen)) continue; In other words, relative to what was queued to 'pu', something like this instead.... -- >8 -- Subject: [PATCH] fixup: matching path_matches() in attr.c to that of dir.c In this function, baselen does not count the trailing slash that should come after the directory name held in "basename" variable, so whenever the corresponding code in dir.c:excluded_from_list() refers to x->baselen, we would need to use "baselen+1" consistently. Also remove unnecessary NUL-termination of a buffer obtained from calloc(). Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx> --- attr.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/attr.c b/attr.c index 7e85f82..a9c04a8 100644 --- a/attr.c +++ b/attr.c @@ -250,7 +250,6 @@ static struct match_attr *parse_attr_line(const char *line, const char *src, else { char *p = (char *)&(res->state[num_attr]); memcpy(p, name, namelen); - p[namelen] = 0; res->u.pat.pattern = p; parse_exclude_pattern(&res->u.pat.pattern, &res->u.pat.patternlen, @@ -687,19 +686,21 @@ static int path_matches(const char *pathname, int pathlen, /* * note: unlike excluded_from_list, baselen here does not - * contain the trailing slash + * count the trailing slash. */ - if (pathlen < baselen || + if (pathlen < baselen + 1 || (baselen && pathname[baselen] != '/') || - strncmp(pathname, base, baselen)) + strncmp_icase(pathname, base, baselen + 1)) return 0; namelen = baselen ? pathlen - baselen - 1 : pathlen; name = pathname + pathlen - namelen; - /* if the non-wildcard part is longer than the remaining - pathname, surely it cannot match */ + /* + * if the non-wildcard part is longer than the remaining + * pathname, surely it cannot match. + */ if (!namelen || prefix > namelen) return 0; -- 1.8.0.rc1.76.g5a375e6 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html