]> Cypherpunks repositories - gostls13.git/commitdiff
path: Fix bug in Match with non-greedy stars
authorKevin Ballard <kevin@sb.org>
Thu, 25 Feb 2010 17:15:52 +0000 (09:15 -0800)
committerRuss Cox <rsc@golang.org>
Thu, 25 Feb 2010 17:15:52 +0000 (09:15 -0800)
path.Match() errors out when testing "*x" against "xxx"
because it matches the star non-greedily. Ensure that
the last chunk consumes the rest of the name.

R=r, rsc
CC=golang-dev
https://golang.org/cl/223050

src/pkg/path/match.go
src/pkg/path/match_test.go

index 4e42b6a10db9afeebf0acbac2bf27cdb9cfdea1a..e3cf08cae2d21679b1b51408772ce37749875d85 100644 (file)
@@ -41,7 +41,10 @@ Pattern:
                }
                // Look for match at current position.
                t, ok, err := matchChunk(chunk, name)
-               if ok {
+               // if we're the last chunk, make sure we've exhausted the name
+               // otherwise we'll give a false result even if we could still match
+               // using the star
+               if ok && (len(t) == 0 || len(pattern) > 0) {
                        name = t
                        continue
                }
@@ -54,6 +57,10 @@ Pattern:
                        for i := 0; i < len(name) && name[i] != '/'; i++ {
                                t, ok, err := matchChunk(chunk, name[i+1:])
                                if ok {
+                                       // if we're the last chunk, make sure we exhausted the name
+                                       if len(pattern) == 0 && len(t) > 0 {
+                                               continue
+                                       }
                                        name = t
                                        continue Pattern
                                }
index d3cd088f19489f86884e726355af716d33512e60..c02384f9274687fa75da1a99b663f6180a9a1717 100644 (file)
@@ -64,6 +64,7 @@ var matchTests = []MatchTest{
        MatchTest{"[-x]", "a", false, ErrBadPattern},
        MatchTest{"\\", "a", false, ErrBadPattern},
        MatchTest{"[a-b-c]", "a", false, ErrBadPattern},
+       MatchTest{"*x", "xxx", true, nil},
 }
 
 func TestMatch(t *testing.T) {