diff options
| author | 2026-01-29 20:33:59 +0100 | |
|---|---|---|
| committer | 2026-01-29 20:33:59 +0100 | |
| commit | daca6d0eb76a7fc8134de35ddb7a4a1d0e184e0c (patch) | |
| tree | 681238fcf1f003e193851528992167c3bb97c92d /internal | |
| parent | packed: Fix message for thin packs not implemented (diff) | |
| signature | No signature | |
zlibx: Make DecompressSized return the number of bytes consumed
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/zlibx/decompress.go | 21 | ||||
| -rw-r--r-- | internal/zlibx/decompress_test.go | 2 |
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) } |
