Commit 20834d64 authored by Kevin Ballard's avatar Kevin Ballard Committed by Russ Cox

path: Fix bug in Match with non-greedy stars

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
parent 24ee7f79
...@@ -41,7 +41,10 @@ Pattern: ...@@ -41,7 +41,10 @@ Pattern:
} }
// Look for match at current position. // Look for match at current position.
t, ok, err := matchChunk(chunk, name) 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 name = t
continue continue
} }
...@@ -54,6 +57,10 @@ Pattern: ...@@ -54,6 +57,10 @@ Pattern:
for i := 0; i < len(name) && name[i] != '/'; i++ { for i := 0; i < len(name) && name[i] != '/'; i++ {
t, ok, err := matchChunk(chunk, name[i+1:]) t, ok, err := matchChunk(chunk, name[i+1:])
if ok { if ok {
// if we're the last chunk, make sure we exhausted the name
if len(pattern) == 0 && len(t) > 0 {
continue
}
name = t name = t
continue Pattern continue Pattern
} }
......
...@@ -64,6 +64,7 @@ var matchTests = []MatchTest{ ...@@ -64,6 +64,7 @@ var matchTests = []MatchTest{
MatchTest{"[-x]", "a", false, ErrBadPattern}, MatchTest{"[-x]", "a", false, ErrBadPattern},
MatchTest{"\\", "a", false, ErrBadPattern}, MatchTest{"\\", "a", false, ErrBadPattern},
MatchTest{"[a-b-c]", "a", false, ErrBadPattern}, MatchTest{"[a-b-c]", "a", false, ErrBadPattern},
MatchTest{"*x", "xxx", true, nil},
} }
func TestMatch(t *testing.T) { func TestMatch(t *testing.T) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment