diff options
author | Máximo Cuadros <mcuadros@gmail.com> | 2020-04-24 14:05:39 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-24 14:05:39 +0200 |
commit | c9533a6f9f3a6edd0fb7c8c161d4016a6af26bc3 (patch) | |
tree | 2046075da6803e110c9d6272d0f49f9f7020d7d3 | |
parent | 218a744b6995a89f5c322aa58e79138d65392ea6 (diff) | |
parent | 63967abe62ecba22a792e728f1af509f3604881f (diff) | |
download | go-git-c9533a6f9f3a6edd0fb7c8c161d4016a6af26bc3.tar.gz |
Merge pull request #39 from kevans91/fixread
storage/filesystem: dotgit, sanity check provided reference path
-rw-r--r-- | storage/filesystem/dotgit/dotgit.go | 11 | ||||
-rw-r--r-- | storage/filesystem/dotgit/dotgit_test.go | 14 |
2 files changed, 24 insertions, 1 deletions
diff --git a/storage/filesystem/dotgit/dotgit.go b/storage/filesystem/dotgit/dotgit.go index 503ce18..8c3896b 100644 --- a/storage/filesystem/dotgit/dotgit.go +++ b/storage/filesystem/dotgit/dotgit.go @@ -59,6 +59,9 @@ var ( // targeting a non-existing object. This usually means the repository // is corrupt. ErrSymRefTargetNotFound = errors.New("symbolic reference target not found") + // ErrIsDir is returned when a reference file is attempting to be read, + // but the path specified is a directory. + ErrIsDir = errors.New("reference path is a directory") ) // Options holds configuration for the storage. @@ -946,6 +949,14 @@ func (d *DotGit) addRefFromHEAD(refs *[]*plumbing.Reference) error { func (d *DotGit) readReferenceFile(path, name string) (ref *plumbing.Reference, err error) { path = d.fs.Join(path, d.fs.Join(strings.Split(name, "/")...)) + st, err := d.fs.Stat(path) + if err != nil { + return nil, err + } + if st.IsDir() { + return nil, ErrIsDir + } + f, err := d.fs.Open(path) if err != nil { return nil, err diff --git a/storage/filesystem/dotgit/dotgit_test.go b/storage/filesystem/dotgit/dotgit_test.go index d57ff15..519f601 100644 --- a/storage/filesystem/dotgit/dotgit_test.go +++ b/storage/filesystem/dotgit/dotgit_test.go @@ -93,9 +93,15 @@ func testSetRefs(c *C, dir *DotGit) { ), nil) c.Assert(err, IsNil) + err = dir.SetRef(plumbing.NewReferenceFromStrings( + "refs/heads/feature/baz", + "e8d3ffab552895c19b9fcf7aa264d277cde33881", + ), nil) + c.Assert(err, IsNil) + refs, err := dir.Refs() c.Assert(err, IsNil) - c.Assert(refs, HasLen, 2) + c.Assert(refs, HasLen, 3) ref := findReference(refs, "refs/heads/foo") c.Assert(ref, NotNil) @@ -108,6 +114,12 @@ func testSetRefs(c *C, dir *DotGit) { ref = findReference(refs, "bar") c.Assert(ref, IsNil) + _, err = dir.readReferenceFile(".", "refs/heads/feature/baz") + c.Assert(err, IsNil) + + _, err = dir.readReferenceFile(".", "refs/heads/feature") + c.Assert(err, Equals, ErrIsDir) + ref, err = dir.Ref("refs/heads/foo") c.Assert(err, IsNil) c.Assert(ref, NotNil) |