aboutsummaryrefslogtreecommitdiffstats
path: root/storage/filesystem/dotgit
diff options
context:
space:
mode:
authorKyle Evans <kevans@FreeBSD.org>2020-04-23 17:47:05 -0500
committerKyle Evans <kevans@FreeBSD.org>2020-04-23 18:19:22 -0500
commit63967abe62ecba22a792e728f1af509f3604881f (patch)
tree2046075da6803e110c9d6272d0f49f9f7020d7d3 /storage/filesystem/dotgit
parent9c7d576132a760645e3a6b3ebdf51c4aef532794 (diff)
downloadgo-git-63967abe62ecba22a792e728f1af509f3604881f.tar.gz
storage/filesystem: dotgit, sanity check provided reference path
On some operating systems, read() of a directory fd may actually succeed and return garbage resembling on-disk contents. As a result, dotgit may return successful from readReferenceFile() when it should in-fact not. This fixes readReferenceFile() on FreeBSD. Signed-off-by: Kyle Evans <kevans@FreeBSD.org>
Diffstat (limited to 'storage/filesystem/dotgit')
-rw-r--r--storage/filesystem/dotgit/dotgit.go11
-rw-r--r--storage/filesystem/dotgit/dotgit_test.go2
2 files changed, 12 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 403f5ff..519f601 100644
--- a/storage/filesystem/dotgit/dotgit_test.go
+++ b/storage/filesystem/dotgit/dotgit_test.go
@@ -118,7 +118,7 @@ func testSetRefs(c *C, dir *DotGit) {
c.Assert(err, IsNil)
_, err = dir.readReferenceFile(".", "refs/heads/feature")
- c.Assert(err, NotNil)
+ c.Assert(err, Equals, ErrIsDir)
ref, err = dir.Ref("refs/heads/foo")
c.Assert(err, IsNil)