From a29b6ed2510795bb7bca93bb6fadb09cf4c0345d Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Mon, 17 Apr 2023 15:43:27 -0700 Subject: [PATCH] added decoder errata paragraph for compressed blocks of size exactly 128 KB which used to be disallowed by the spec but have become allowed in more recent version of the spec. While this limitation is fixed in decoders v1.5.4+, implementers should refrain from generating such block with their custom encoder as they could be misclassified as corrupted by older decoder versions. --- doc/decompressor_errata.md | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/doc/decompressor_errata.md b/doc/decompressor_errata.md index b162e7fd6..6c99cb01f 100644 --- a/doc/decompressor_errata.md +++ b/doc/decompressor_errata.md @@ -6,12 +6,29 @@ Each entry will contain: 1. The last affected decompressor versions. 2. The decompressor components affected. 2. Whether the compressed frame could ever be produced by the reference compressor. -3. An example frame. +3. An example frame when it can be short enough to be displayed as hexadecimal 4. A description of the bug. The document is in reverse chronological order, with the bugs that affect the most recent zstd decompressor versions listed first. +Compressed block with a size of exactly 128 KB +------------------------------------------------ + +**Last affected version**: v1.5.2 + +**Affected decompressor component(s)**: Library & CLI + +**Produced by the reference compressor**: No + +The zstd decoder incorrectly rejected blocks of type `Compressed_Block` when their size was exactly 128 KB. + +This type of block was never generated by the reference compressor. + +These blocks used to be disallowed by the spec up until spec version 0.3.2 when the restriction was lifted by [PR#1689](https://github.com/facebook/zstd/pull/1689). + +> A Compressed_Block has the extra restriction that Block_Size is always strictly less than the decompressed size. If this condition cannot be respected, the block must be sent uncompressed instead (Raw_Block). + Compressed block with 0 literals and 0 sequences ------------------------------------------------