diff options
| author | 2025-11-17 00:00:00 +0000 | |
|---|---|---|
| committer | 2025-11-17 00:00:00 +0000 | |
| commit | 1dcb92427c23d0a8b23c0154b892243c749afa5a (patch) | |
| tree | 0683fa19e05d2ea0ceac324dafdcd49eb6cdb2ec /pack_midx.go | |
| parent | Add internal todo (diff) | |
Compute checksum when reading packfiles
Diffstat (limited to 'pack_midx.go')
| -rw-r--r-- | pack_midx.go | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/pack_midx.go b/pack_midx.go index 748bdaf6..04151dfe 100644 --- a/pack_midx.go +++ b/pack_midx.go @@ -1,6 +1,7 @@ package furgit import ( + "bytes" "fmt" "os" "path/filepath" @@ -235,6 +236,23 @@ func (midx *multiPackIndex) parse(buf []byte) error { midx.oids = oids midx.offsets = offsets midx.largeOffs = largeOffs + + if len(buf) < midx.repo.hashSize { + return ErrInvalidObject + } + midxChecksumStart := len(buf) - midx.repo.hashSize + midxChecksumInFile := buf[midxChecksumStart:] + + hashFn, ok := hashFuncs[midx.repo.hashSize] + if !ok { + return fmt.Errorf("furgit: unsupported hash size %d", midx.repo.hashSize) + } + + computedHash := hashFn(buf[:midxChecksumStart]) + if !bytes.Equal(computedHash.data[:midx.repo.hashSize], midxChecksumInFile) { + return fmt.Errorf("furgit: multi-pack-index checksum mismatch") + } + return nil } |
