authorgravatar for 4678790+dweiller@users.noreply.github.comDominic <4678790+dweiller@users.noreply.github.com> 2023-02-12 22:02:24+11:00
committergravatar for 4678790+dweiller@users.noreply.github.comDominic <4678790+dweiller@users.noreply.github.com> 2023-02-20 09:09:06+11:00
log5a31fc2014ed6c1d806d08f1393e10b597ec427d
treee61f01d27271a7c91916870325705af5c7d5cf17
parent8fd41314bdb81303d8e674d292a384c9df352a05

std.compress.zstandard: fix erroneous literal stream empty checks


1 files changed, 18 insertions(+), 3 deletions(-)

lib/std/compress/zstandard/decode/block.zig+18-3
...@@ -678,7 +678,12 @@ pub fn decodeBlock(...@@ -678,7 +678,12 @@ pub fn decodeBlock(
678 bytes_written += len;678 bytes_written += len;
679 }679 }
680680
681 if (!decode_state.isLiteralStreamEmpty()) return error.MalformedCompressedBlock;681 switch (decode_state.literal_header.block_type) {
682 .treeless, .compressed => {
683 if (!decode_state.isLiteralStreamEmpty()) return error.MalformedCompressedBlock;
684 },
685 .raw, .rle => {},
686 }
682687
683 consumed_count.* += block_size;688 consumed_count.* += block_size;
684 return bytes_written;689 return bytes_written;
...@@ -766,7 +771,12 @@ pub fn decodeBlockRingBuffer(...@@ -766,7 +771,12 @@ pub fn decodeBlockRingBuffer(
766 bytes_written += len;771 bytes_written += len;
767 }772 }
768773
769 if (!decode_state.isLiteralStreamEmpty()) return error.MalformedCompressedBlock;774 switch (decode_state.literal_header.block_type) {
775 .treeless, .compressed => {
776 if (!decode_state.isLiteralStreamEmpty()) return error.MalformedCompressedBlock;
777 },
778 .raw, .rle => {},
779 }
770780
771 consumed_count.* += block_size;781 consumed_count.* += block_size;
772 if (bytes_written > block_size_max) return error.BlockSizeOverMaximum;782 if (bytes_written > block_size_max) return error.BlockSizeOverMaximum;
...@@ -853,7 +863,12 @@ pub fn decodeBlockReader(...@@ -853,7 +863,12 @@ pub fn decodeBlockReader(
853 bytes_written += len;863 bytes_written += len;
854 }864 }
855865
856 if (!decode_state.isLiteralStreamEmpty()) return error.MalformedCompressedBlock;866 switch (decode_state.literal_header.block_type) {
867 .treeless, .compressed => {
868 if (!decode_state.isLiteralStreamEmpty()) return error.MalformedCompressedBlock;
869 },
870 .raw, .rle => {},
871 }
857872
858 if (bytes_written > block_size_max) return error.BlockSizeOverMaximum;873 if (bytes_written > block_size_max) return error.BlockSizeOverMaximum;
859 if (block_reader_limited.bytes_left != 0) return error.MalformedCompressedBlock;874 if (block_reader_limited.bytes_left != 0) return error.MalformedCompressedBlock;