From 5a31fc2014ed6c1d806d08f1393e10b597ec427d Mon Sep 17 00:00:00 2001 From: dweiller <4678790+dweiller@users.noreplay.github.com> Date: Sun, 12 Feb 2023 22:02:24 +1100 Subject: [PATCH] std.compress.zstandard: fix erroneous literal stream empty checks --- lib/std/compress/zstandard/decode/block.zig | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/lib/std/compress/zstandard/decode/block.zig b/lib/std/compress/zstandard/decode/block.zig index 7cc4c146ca..18fbf289e2 100644 --- a/lib/std/compress/zstandard/decode/block.zig +++ b/lib/std/compress/zstandard/decode/block.zig @@ -678,7 +678,12 @@ pub fn decodeBlock( bytes_written += len; } - if (!decode_state.isLiteralStreamEmpty()) return error.MalformedCompressedBlock; + switch (decode_state.literal_header.block_type) { + .treeless, .compressed => { + if (!decode_state.isLiteralStreamEmpty()) return error.MalformedCompressedBlock; + }, + .raw, .rle => {}, + } consumed_count.* += block_size; return bytes_written; @@ -766,7 +771,12 @@ pub fn decodeBlockRingBuffer( bytes_written += len; } - if (!decode_state.isLiteralStreamEmpty()) return error.MalformedCompressedBlock; + switch (decode_state.literal_header.block_type) { + .treeless, .compressed => { + if (!decode_state.isLiteralStreamEmpty()) return error.MalformedCompressedBlock; + }, + .raw, .rle => {}, + } consumed_count.* += block_size; if (bytes_written > block_size_max) return error.BlockSizeOverMaximum; @@ -853,7 +863,12 @@ pub fn decodeBlockReader( bytes_written += len; } - if (!decode_state.isLiteralStreamEmpty()) return error.MalformedCompressedBlock; + switch (decode_state.literal_header.block_type) { + .treeless, .compressed => { + if (!decode_state.isLiteralStreamEmpty()) return error.MalformedCompressedBlock; + }, + .raw, .rle => {}, + } if (bytes_written > block_size_max) return error.BlockSizeOverMaximum; if (block_reader_limited.bytes_left != 0) return error.MalformedCompressedBlock;