aboutsummaryrefslogtreecommitdiff
path: root/pack_midx.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2025-11-17 00:00:00 +0000
committerGravatar Runxi Yu2025-11-17 00:00:00 +0000
commit1dcb92427c23d0a8b23c0154b892243c749afa5a (patch)
tree0683fa19e05d2ea0ceac324dafdcd49eb6cdb2ec /pack_midx.go
parentAdd internal todo (diff)
Compute checksum when reading packfiles
Diffstat (limited to 'pack_midx.go')
-rw-r--r--pack_midx.go18
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
}