aboutsummaryrefslogtreecommitdiff
path: root/format/pack
diff options
context:
space:
mode:
Diffstat (limited to 'format/pack')
-rw-r--r--format/pack/entry.go9
-rw-r--r--format/pack/pack.go4
2 files changed, 13 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
}
diff --git a/format/pack/pack.go b/format/pack/pack.go
index 45fe6a1c..e87e3360 100644
--- a/format/pack/pack.go
+++ b/format/pack/pack.go
@@ -33,16 +33,20 @@ func ParseOfsDeltaDistance(buf []byte) (uint64, int, error) {
if len(buf) == 0 {
return 0, 0, fmt.Errorf("format/pack: malformed ofs-delta distance")
}
+
b := buf[0]
dist := uint64(b & 0x7f)
+
consumed := 1
for b&0x80 != 0 {
if consumed >= len(buf) {
return 0, 0, fmt.Errorf("format/pack: malformed ofs-delta distance")
}
+
b = buf[consumed]
consumed++
dist = ((dist + 1) << 7) + uint64(b&0x7f)
}
+
return dist, consumed, nil
}