aboutsummaryrefslogtreecommitdiff
path: root/format/pack/entry.go
diff options
context:
space:
mode:
Diffstat (limited to 'format/pack/entry.go')
-rw-r--r--format/pack/entry.go9
1 files changed, 9 insertions, 0 deletions
diff --git a/format/pack/entry.go b/format/pack/entry.go
index b95ad0ac..93d232a2 100644
--- a/format/pack/entry.go
+++ b/format/pack/entry.go
@@ -31,19 +31,23 @@ func ParseEntryHeader(data []byte) (EntryHeader, error) {
}
shift := uint(4)
+
b := first
for b&0x80 != 0 {
if header.HeaderSize >= len(data) {
return zero, fmt.Errorf("format/pack: truncated entry header")
}
+
b = data[header.HeaderSize]
header.HeaderSize++
header.Size |= int64(b&0x7f) << shift
shift += 7
}
+
if header.Size < 0 {
return zero, fmt.Errorf("format/pack: negative entry size")
}
+
return header, nil
}
@@ -73,6 +77,7 @@ func ParseEntry(data []byte, hashSize int) (Entry, error) {
if err != nil {
return zero, err
}
+
entry := Entry{
Type: header.Type,
Size: header.Size,
@@ -86,10 +91,12 @@ func ParseEntry(data []byte, hashSize int) (Entry, error) {
if hashSize <= 0 {
return zero, fmt.Errorf("format/pack: invalid hash size %d", hashSize)
}
+
end := entry.DataOffset + hashSize
if end > len(data) {
return zero, fmt.Errorf("format/pack: truncated ref-delta base id")
}
+
entry.RefBaseID = data[entry.DataOffset:end]
entry.DataOffset = end
case objecttype.TypeOfsDelta:
@@ -97,6 +104,7 @@ func ParseEntry(data []byte, hashSize int) (Entry, error) {
if err != nil {
return zero, err
}
+
entry.OfsBaseDistance = dist
entry.DataOffset += consumed
case objecttype.TypeInvalid, objecttype.TypeFuture:
@@ -108,5 +116,6 @@ func ParseEntry(data []byte, hashSize int) (Entry, error) {
if entry.DataOffset > len(data) {
return zero, fmt.Errorf("format/pack: entry data offset out of bounds")
}
+
return entry, nil
}