diff options
| author | 2026-03-04 08:26:56 +0800 | |
|---|---|---|
| committer | 2026-03-04 08:59:53 +0800 | |
| commit | ab7501be34032fb9e5c48726a68ae90a917af9eb (patch) | |
| tree | 20d005647569befea8133e953c3270e8fd2a2a5b /format/pack/entry.go | |
| parent | *: gofumpt (diff) | |
| signature | No signature | |
*: Lint
Diffstat (limited to 'format/pack/entry.go')
| -rw-r--r-- | format/pack/entry.go | 9 |
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 } |
