aboutsummaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-01-29 20:33:59 +0100
committerGravatar Runxi Yu2026-01-29 20:33:59 +0100
commitdaca6d0eb76a7fc8134de35ddb7a4a1d0e184e0c (patch)
tree681238fcf1f003e193851528992167c3bb97c92d /internal
parentpacked: Fix message for thin packs not implemented (diff)
signatureNo signature
zlibx: Make DecompressSized return the number of bytes consumed
Diffstat (limited to 'internal')
-rw-r--r--internal/zlibx/decompress.go21
-rw-r--r--internal/zlibx/decompress_test.go2
2 files changed, 12 insertions, 11 deletions
diff --git a/internal/zlibx/decompress.go b/internal/zlibx/decompress.go
index 23fae8fa..6bb5d45c 100644
--- a/internal/zlibx/decompress.go
+++ b/internal/zlibx/decompress.go
@@ -10,44 +10,45 @@ import (
)
func Decompress(src []byte) (bufpool.Buffer, error) {
- return DecompressSized(src, 0)
+ out, _, err := DecompressSized(src, 0)
+ return out, err
}
-func DecompressSized(src []byte, sizeHint int) (bufpool.Buffer, error) {
+func DecompressSized(src []byte, sizeHint int) (bufpool.Buffer, int, error) {
if len(src) < 6 {
- return bufpool.Buffer{}, io.ErrUnexpectedEOF
+ return bufpool.Buffer{}, 0, io.ErrUnexpectedEOF
}
cmf := src[0]
flg := src[1]
if (cmf&0x0f != zlibDeflate) || (cmf>>4 > zlibMaxWindow) || (binary.BigEndian.Uint16(src[:2])%31 != 0) {
- return bufpool.Buffer{}, ErrHeader
+ return bufpool.Buffer{}, 0, ErrHeader
}
offset := 2
if flg&0x20 != 0 {
- return bufpool.Buffer{}, ErrHeader
+ return bufpool.Buffer{}, 0, ErrHeader
}
if len(src[offset:]) < 4 {
- return bufpool.Buffer{}, io.ErrUnexpectedEOF
+ return bufpool.Buffer{}, 0, io.ErrUnexpectedEOF
}
deflateData := src[offset:]
out, consumed, err := flatex.DecompressSized(deflateData, sizeHint)
if err != nil {
- return bufpool.Buffer{}, err
+ return bufpool.Buffer{}, 0, err
}
checksumPos := offset + consumed
if checksumPos+4 > len(src) {
out.Release()
- return bufpool.Buffer{}, io.ErrUnexpectedEOF
+ return bufpool.Buffer{}, 0, io.ErrUnexpectedEOF
}
expected := binary.BigEndian.Uint32(src[checksumPos : checksumPos+4])
if expected != adler32.Checksum(out.Bytes()) {
out.Release()
- return bufpool.Buffer{}, ErrChecksum
+ return bufpool.Buffer{}, 0, ErrChecksum
}
- return out, nil
+ return out, checksumPos + 4, nil
}
diff --git a/internal/zlibx/decompress_test.go b/internal/zlibx/decompress_test.go
index 2b9f0672..bea348d2 100644
--- a/internal/zlibx/decompress_test.go
+++ b/internal/zlibx/decompress_test.go
@@ -155,7 +155,7 @@ func TestDecompressSizedUsesHint(t *testing.T) {
compressed := compressZlib(t, payload)
const hint = 1 << 20
- out, err := DecompressSized(compressed, hint)
+ out, _, err := DecompressSized(compressed, hint)
if err != nil {
t.Fatalf("DecompressSized: %v", err)
}