aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-06-11 07:53:21 +0000
committerGravatar Runxi Yu2026-06-11 07:53:21 +0000
commit12da02069e0900ad751c5bd507ca540cd5431d7f (patch)
tree182ed74a225bb23d13262502c104af5e2fe4639d
parentinternal/format/packfile: Clean EntryType (diff)
internal/format/packfile: Refactor ofs delta distances
-rw-r--r--internal/format/packfile/ofs.go46
1 files changed, 42 insertions, 4 deletions
diff --git a/internal/format/packfile/ofs.go b/internal/format/packfile/ofs.go
index ae9d8c22..5fb8ecdd 100644
--- a/internal/format/packfile/ofs.go
+++ b/internal/format/packfile/ofs.go
@@ -2,14 +2,25 @@ package packfile
import (
"errors"
+ "fmt"
+ "math"
)
-var ErrMalformedOfsDeltaDistance = errors.New("internal/format/packfile/delta: malformed ofs-delta distance")
+// ErrMalformedOfsDeltaDistance reports that
+// an ofs-delta backward distance encoding
+// is truncated, overlong, or overflows uint64.
+var ErrMalformedOfsDeltaDistance = errors.New("internal/format/packfile: malformed ofs-delta distance")
+
+// MaxOfsDeltaDistanceLen is the maximum encoded length
+// of an ofs-delta backward distance.
+// Every uint64 distance is encodable within this bound,
+// and [ParseOfsDeltaDistance] rejects longer encodings.
+const MaxOfsDeltaDistanceLen = 10
// ParseOfsDeltaDistance parses an ofs-delta backward distance.
func ParseOfsDeltaDistance(buf []byte) (dist uint64, consumed int, err error) {
if len(buf) == 0 {
- return 0, 0, ErrMalformedOfsDeltaDistance
+ return 0, 0, fmt.Errorf("%w: truncated", ErrMalformedOfsDeltaDistance)
}
b := buf[0]
@@ -17,14 +28,41 @@ func ParseOfsDeltaDistance(buf []byte) (dist uint64, consumed int, err error) {
consumed = 1
for b&0x80 != 0 {
+ if consumed >= MaxOfsDeltaDistanceLen {
+ return 0, 0, fmt.Errorf("%w: overlong encoding", ErrMalformedOfsDeltaDistance)
+ }
+
if consumed >= len(buf) {
- return 0, 0, ErrMalformedOfsDeltaDistance
+ return 0, 0, fmt.Errorf("%w: truncated", ErrMalformedOfsDeltaDistance)
+ }
+
+ if dist >= math.MaxUint64>>7 {
+ return 0, 0, fmt.Errorf("%w: overflows uint64", ErrMalformedOfsDeltaDistance)
}
b = buf[consumed]
consumed++
- dist = ((dist + 1) << 7) + uint64(b&0x7f)
+ dist = ((dist + 1) << 7) | uint64(b&0x7f)
}
return dist, consumed, nil
}
+
+// AppendOfsDeltaDistance appends the encoding of
+// an ofs-delta backward distance to dst.
+func AppendOfsDeltaDistance(dst []byte, dist uint64) []byte {
+ var buf [MaxOfsDeltaDistanceLen]byte
+
+ pos := len(buf) - 1
+ buf[pos] = byte(dist & 0x7f)
+
+ dist >>= 7
+ for dist != 0 {
+ dist--
+ pos--
+ buf[pos] = 0x80 | byte(dist&0x7f)
+ dist >>= 7
+ }
+
+ return append(dst, buf[pos:]...)
+}