Nguyễn Thái Ngọc Duy  <pclo...@gmail.com> 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 <gits...@pobox.com>
---
 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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to