aboutsummaryrefslogtreecommitdiff
path: root/objectstore
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-02-22 09:59:27 +0800
committerGravatar Runxi Yu2026-02-22 09:59:27 +0800
commit6e28d6a7ec210349b8c336249ba130422310fecb (patch)
treed4cbbe519970ee3d78aebf81a993f4202a9ef868 /objectstore
parentbufpool: Document how .Bytes is intended to be used (diff)
signatureNo signature
objectstore/packed: Pre-allocate instead of ReadAll
Diffstat (limited to 'objectstore')
-rw-r--r--objectstore/packed/entry_inflate.go27
1 files changed, 17 insertions, 10 deletions
diff --git a/objectstore/packed/entry_inflate.go b/objectstore/packed/entry_inflate.go
index 1880212b..4f91710e 100644
--- a/objectstore/packed/entry_inflate.go
+++ b/objectstore/packed/entry_inflate.go
@@ -4,6 +4,7 @@ import (
"bytes"
"fmt"
"io"
+ "math"
"codeberg.org/lindenii/furgit/internal/zlib"
)
@@ -17,8 +18,6 @@ func zlibReaderAt(pack *packFile, offset int) (io.ReadCloser, error) {
}
// inflateAt inflates one entry payload from data offset.
-//
-// When expectedSize is non-negative, the inflated length must match.
func inflateAt(pack *packFile, offset int, expectedSize int64) ([]byte, error) {
reader, err := zlibReaderAt(pack, offset)
if err != nil {
@@ -26,17 +25,25 @@ func inflateAt(pack *packFile, offset int, expectedSize int64) ([]byte, error) {
}
defer func() { _ = reader.Close() }()
+ if expectedSize >= 0 {
+ if expectedSize > int64(math.MaxInt) {
+ return nil, fmt.Errorf(
+ "objectstore/packed: pack %q expected inflated size overflows int: %d",
+ pack.name,
+ expectedSize,
+ )
+ }
+
+ body := make([]byte, int(expectedSize))
+ if _, err := io.ReadFull(reader, body); err != nil {
+ return nil, err
+ }
+ return body, nil
+ }
+
body, err := io.ReadAll(reader)
if err != nil {
return nil, err
}
- if expectedSize >= 0 && int64(len(body)) != expectedSize {
- return nil, fmt.Errorf(
- "objectstore/packed: pack %q inflated size mismatch: got %d want %d",
- pack.name,
- len(body),
- expectedSize,
- )
- }
return body, nil
}