shithub: furgit

Download patch

ref: 6e28d6a7ec210349b8c336249ba130422310fecb
parent: 36ca8828cb5fb76a2a9b6c821f7d7ca18e9e83bc
author: Runxi Yu <me@runxiyu.org>
date: Sun Feb 22 04:59:27 EST 2026

objectstore/packed: Pre-allocate instead of ReadAll

--- a/objectstore/packed/entry_inflate.go
+++ b/objectstore/packed/entry_inflate.go
@@ -4,6 +4,7 @@
 	"bytes"
 	"fmt"
 	"io"
+	"math"
 
 	"codeberg.org/lindenii/furgit/internal/zlib"
 )
@@ -17,8 +18,6 @@
 }
 
 // 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 @@
 	}
 	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
 }
--