Skip to content

Commit a56fb9c

Browse files
committed
plumbing: object, check legitimacy in (*Tree).Encode, export TreeSorter
1 parent 952f1ba commit a56fb9c

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

plumbing/object/tree.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"io"
88
"path"
99
"path/filepath"
10+
"sort"
1011
"strings"
1112

1213
"github.com/go-git/go-git/v5/plumbing"
@@ -270,6 +271,28 @@ func (t *Tree) Decode(o plumbing.EncodedObject) (err error) {
270271
return nil
271272
}
272273

274+
type EntrySorter []TreeEntry
275+
276+
func (s EntrySorter) Len() int {
277+
return len(s)
278+
}
279+
280+
func (s EntrySorter) Less(i, j int) bool {
281+
name1 := s[i].Name
282+
name2 := s[j].Name
283+
if s[i].Mode == filemode.Dir {
284+
name1 += "/"
285+
}
286+
if s[j].Mode == filemode.Dir {
287+
name2 += "/"
288+
}
289+
return name1 < name2
290+
}
291+
292+
func (s EntrySorter) Swap(i, j int) {
293+
s[i], s[j] = s[j], s[i]
294+
}
295+
273296
// Encode transforms a Tree into a plumbing.EncodedObject.
274297
func (t *Tree) Encode(o plumbing.EncodedObject) (err error) {
275298
o.SetType(plumbing.TreeObject)
@@ -279,7 +302,15 @@ func (t *Tree) Encode(o plumbing.EncodedObject) (err error) {
279302
}
280303

281304
defer ioutil.CheckClose(w, &err)
305+
306+
if !sort.IsSorted(EntrySorter(t.Entries)) {
307+
return errors.New("entries in tree is not sorted")
308+
}
309+
282310
for _, entry := range t.Entries {
311+
if strings.IndexByte(entry.Name, 0) != -1 {
312+
return fmt.Errorf("malformed filename '%s'", entry.Name)
313+
}
283314
if _, err = fmt.Fprintf(w, "%o %s", entry.Mode, entry.Name); err != nil {
284315
return err
285316
}

plumbing/object/tree_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"errors"
66
"io"
7+
"sort"
78
"testing"
89

910
fixtures "github.com/go-git/go-git-fixtures/v4"
@@ -231,6 +232,7 @@ func (s *TreeSuite) TestTreeDecodeEncodeIdempotent(c *C) {
231232
},
232233
}
233234
for _, tree := range trees {
235+
sort.Sort(EntrySorter(tree.Entries))
234236
obj := &plumbing.MemoryObject{}
235237
err := tree.Encode(obj)
236238
c.Assert(err, IsNil)

0 commit comments

Comments
 (0)