diff options
author | Michael Muré <batolettre@gmail.com> | 2023-01-14 12:52:56 +0100 |
---|---|---|
committer | Michael Muré <batolettre@gmail.com> | 2023-01-14 12:52:56 +0100 |
commit | cfec9e38e6519e80e1e3ac3de224ffd33997bcea (patch) | |
tree | 2365448c2071346ec6ecf6151e838c3be6fcc2c9 /storage/filesystem/dotgit | |
parent | 5dabd83e3712e2554745c736b55df405a0ba4f33 (diff) | |
download | go-git-cfec9e38e6519e80e1e3ac3de224ffd33997bcea.tar.gz |
dotgit: fix a filesystem race in Refs/walkReferencesTree
In walkReferencesTree(), the filesystem is browsed recursively. After a folder
is listed, each child element (directory, file) are inspected.
What can happen is that by the time we get to operate on the child element, it
might have been deleted from the filesystem and we would get a PathError.
In the case of directories there was already a case to avoid bubbling up the error
(we consider that there is no ref there, which is correct), but that was missing
for files. This commit just apply the same logic.
Diffstat (limited to 'storage/filesystem/dotgit')
-rw-r--r-- | storage/filesystem/dotgit/dotgit.go | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/storage/filesystem/dotgit/dotgit.go b/storage/filesystem/dotgit/dotgit.go index 6c386f7..2be2bae 100644 --- a/storage/filesystem/dotgit/dotgit.go +++ b/storage/filesystem/dotgit/dotgit.go @@ -943,6 +943,7 @@ func (d *DotGit) walkReferencesTree(refs *[]*plumbing.Reference, relPath []strin files, err := d.fs.ReadDir(d.fs.Join(relPath...)) if err != nil { if os.IsNotExist(err) { + // a race happened, and our directory is gone now return nil } @@ -960,6 +961,10 @@ func (d *DotGit) walkReferencesTree(refs *[]*plumbing.Reference, relPath []strin } ref, err := d.readReferenceFile(".", strings.Join(newRelPath, "/")) + if os.IsNotExist(err) { + // a race happened, and our file is gone now + continue + } if err != nil { return err } |