diff --git a/internal/lz4block/blocks.go b/internal/lz4block/blocks.go index 138083d9..a1bfa99e 100644 --- a/internal/lz4block/blocks.go +++ b/internal/lz4block/blocks.go @@ -8,9 +8,12 @@ const ( Block256Kb Block1Mb Block4Mb - Block8Mb = 2 * Block4Mb ) +// In legacy mode all blocks are compressed regardless +// of the compressed size: use the bound size. +var Block8Mb = uint32(CompressBlockBound(8 << 20)) + var ( BlockPool64K = sync.Pool{New: func() interface{} { return make([]byte, Block64Kb) }} BlockPool256K = sync.Pool{New: func() interface{} { return make([]byte, Block256Kb) }} diff --git a/internal/lz4stream/block.go b/internal/lz4stream/block.go index e9646546..459086f0 100644 --- a/internal/lz4stream/block.go +++ b/internal/lz4stream/block.go @@ -224,7 +224,9 @@ func (b *FrameDataBlock) Close(f *Frame) { func (b *FrameDataBlock) Compress(f *Frame, src []byte, level lz4block.CompressionLevel) *FrameDataBlock { data := b.data if f.isLegacy() { - data = data[:cap(data)] + // In legacy mode, the buffer is sized according to CompressBlockBound, + // but only 8Mb is buffered for compression. + src = src[:8<<20] } else { data = data[:len(src)] // trigger the incompressible flag in CompressBlock }