diff options
author | Toon Claes <toon@iotcl.com> | 2022-10-12 17:24:33 +0200 |
---|---|---|
committer | Toon Claes <toon@iotcl.com> | 2022-10-12 17:33:46 +0200 |
commit | 7dd5d8f39a3c31c8257c29a8cfa4ef2cf15d4a80 (patch) | |
tree | 95f8fa1512318b887697ef5914e3f91b77ee9b81 | |
parent | 08cffa1efade914020497a73907763e8d3707a77 (diff) | |
download | go-git-7dd5d8f39a3c31c8257c29a8cfa4ef2cf15d4a80.tar.gz |
plumbing: gitattributes, Avoid index out of range
When a path is deeper than the single asterisk pattern the code would
crash with a "index out of range".
This change checks the length of the remaining pattern before it
references an element of that slice.
With a single trailing asterisk paths deeper than the pattern should not
get the attributes.
For example with the following `.gitattributes` file:
thirdparty/* linguist-vendored
This is how git handles it:
$ git check-attr --all thirdparty/README.md
thirdparty/README.md: diff: markdown
thirdparty/README.md: linguist-vendored: set
$ git check-attr --all thirdparty/package/README.md
thirdparty/package/README.md: diff: markdown
-rw-r--r-- | plumbing/format/gitattributes/pattern.go | 5 | ||||
-rw-r--r-- | plumbing/format/gitattributes/pattern_test.go | 6 |
2 files changed, 11 insertions, 0 deletions
diff --git a/plumbing/format/gitattributes/pattern.go b/plumbing/format/gitattributes/pattern.go index d961aba..f101f47 100644 --- a/plumbing/format/gitattributes/pattern.go +++ b/plumbing/format/gitattributes/pattern.go @@ -52,6 +52,11 @@ func (p *pattern) Match(path []string) bool { var match, doublestar bool var err error for _, part := range path { + // path is deeper than pattern + if len(pattern) == 0 { + return false + } + // skip empty if pattern[0] == "" { pattern = pattern[1:] diff --git a/plumbing/format/gitattributes/pattern_test.go b/plumbing/format/gitattributes/pattern_test.go index f95be6e..981d56f 100644 --- a/plumbing/format/gitattributes/pattern_test.go +++ b/plumbing/format/gitattributes/pattern_test.go @@ -174,6 +174,12 @@ func (s *PatternSuite) TestGlobMatch_tailingAsterisks_single(c *C) { c.Assert(r, Equals, true) } +func (s *PatternSuite) TestGlobMatch_tailingAsterisk_single(c *C) { + p := ParsePattern("/*lue/*", nil) + r := p.Match([]string{"value", "volcano", "tail"}) + c.Assert(r, Equals, false) +} + func (s *PatternSuite) TestGlobMatch_tailingAsterisks_exactMatch(c *C) { p := ParsePattern("/*lue/vol?ano/**", nil) r := p.Match([]string{"value", "volcano"}) |