| ... | ... | @@ -654,29 +654,32 @@ pub fn decodeBlock( |
| 654 | 654 | bytes_read += fbs.pos; |
| 655 | 655 | |
| 656 | 656 | var bytes_written: usize = 0; |
| 657 | | if (sequences_header.sequence_count > 0) { |
| 657 | { |
| 658 | 658 | const bit_stream_bytes = src[bytes_read..block_size]; |
| 659 | 659 | var bit_stream: readers.ReverseBitReader = undefined; |
| 660 | 660 | bit_stream.init(bit_stream_bytes) catch return error.MalformedCompressedBlock; |
| 661 | 661 | |
| 662 | | decode_state.readInitialFseState(&bit_stream) catch return error.MalformedCompressedBlock; |
| 663 | | |
| 664 | | var sequence_size_limit = block_size_max; |
| 665 | | var i: usize = 0; |
| 666 | | while (i < sequences_header.sequence_count) : (i += 1) { |
| 667 | | const write_pos = written_count + bytes_written; |
| 668 | | const decompressed_size = decode_state.decodeSequenceSlice( |
| 669 | | dest, |
| 670 | | write_pos, |
| 671 | | &bit_stream, |
| 672 | | sequence_size_limit, |
| 673 | | i == sequences_header.sequence_count - 1, |
| 674 | | ) catch |err| switch (err) { |
| 675 | | error.DestTooSmall => return error.DestTooSmall, |
| 676 | | else => return error.MalformedCompressedBlock, |
| 677 | | }; |
| 678 | | bytes_written += decompressed_size; |
| 679 | | sequence_size_limit -= decompressed_size; |
| 662 | if (sequences_header.sequence_count > 0) { |
| 663 | decode_state.readInitialFseState(&bit_stream) catch |
| 664 | return error.MalformedCompressedBlock; |
| 665 | |
| 666 | var sequence_size_limit = block_size_max; |
| 667 | var i: usize = 0; |
| 668 | while (i < sequences_header.sequence_count) : (i += 1) { |
| 669 | const write_pos = written_count + bytes_written; |
| 670 | const decompressed_size = decode_state.decodeSequenceSlice( |
| 671 | dest, |
| 672 | write_pos, |
| 673 | &bit_stream, |
| 674 | sequence_size_limit, |
| 675 | i == sequences_header.sequence_count - 1, |
| 676 | ) catch |err| switch (err) { |
| 677 | error.DestTooSmall => return error.DestTooSmall, |
| 678 | else => return error.MalformedCompressedBlock, |
| 679 | }; |
| 680 | bytes_written += decompressed_size; |
| 681 | sequence_size_limit -= decompressed_size; |
| 682 | } |
| 680 | 683 | } |
| 681 | 684 | |
| 682 | 685 | if (!bit_stream.isEmpty()) { |
| ... | ... | @@ -755,24 +758,27 @@ pub fn decodeBlockRingBuffer( |
| 755 | 758 | bytes_read += fbs.pos; |
| 756 | 759 | |
| 757 | 760 | var bytes_written: usize = 0; |
| 758 | | if (sequences_header.sequence_count > 0) { |
| 761 | { |
| 759 | 762 | const bit_stream_bytes = src[bytes_read..block_size]; |
| 760 | 763 | var bit_stream: readers.ReverseBitReader = undefined; |
| 761 | 764 | bit_stream.init(bit_stream_bytes) catch return error.MalformedCompressedBlock; |
| 762 | 765 | |
| 763 | | decode_state.readInitialFseState(&bit_stream) catch return error.MalformedCompressedBlock; |
| 764 | | |
| 765 | | var sequence_size_limit = block_size_max; |
| 766 | | var i: usize = 0; |
| 767 | | while (i < sequences_header.sequence_count) : (i += 1) { |
| 768 | | const decompressed_size = decode_state.decodeSequenceRingBuffer( |
| 769 | | dest, |
| 770 | | &bit_stream, |
| 771 | | sequence_size_limit, |
| 772 | | i == sequences_header.sequence_count - 1, |
| 773 | | ) catch return error.MalformedCompressedBlock; |
| 774 | | bytes_written += decompressed_size; |
| 775 | | sequence_size_limit -= decompressed_size; |
| 766 | if (sequences_header.sequence_count > 0) { |
| 767 | decode_state.readInitialFseState(&bit_stream) catch |
| 768 | return error.MalformedCompressedBlock; |
| 769 | |
| 770 | var sequence_size_limit = block_size_max; |
| 771 | var i: usize = 0; |
| 772 | while (i < sequences_header.sequence_count) : (i += 1) { |
| 773 | const decompressed_size = decode_state.decodeSequenceRingBuffer( |
| 774 | dest, |
| 775 | &bit_stream, |
| 776 | sequence_size_limit, |
| 777 | i == sequences_header.sequence_count - 1, |
| 778 | ) catch return error.MalformedCompressedBlock; |
| 779 | bytes_written += decompressed_size; |
| 780 | sequence_size_limit -= decompressed_size; |
| 781 | } |
| 776 | 782 | } |
| 777 | 783 | |
| 778 | 784 | if (!bit_stream.isEmpty()) { |
| ... | ... | @@ -847,28 +853,32 @@ pub fn decodeBlockReader( |
| 847 | 853 | try decode_state.prepare(block_reader, literals, sequences_header); |
| 848 | 854 | |
| 849 | 855 | var bytes_written: usize = 0; |
| 850 | | if (sequences_header.sequence_count > 0) { |
| 851 | | if (sequence_buffer.len < block_reader_limited.bytes_left) |
| 852 | | return error.SequenceBufferTooSmall; |
| 853 | | |
| 856 | { |
| 854 | 857 | const size = try block_reader.readAll(sequence_buffer); |
| 855 | 858 | var bit_stream: readers.ReverseBitReader = undefined; |
| 856 | 859 | try bit_stream.init(sequence_buffer[0..size]); |
| 857 | 860 | |
| 858 | | decode_state.readInitialFseState(&bit_stream) catch return error.MalformedCompressedBlock; |
| 859 | | |
| 860 | | var sequence_size_limit = block_size_max; |
| 861 | | var i: usize = 0; |
| 862 | | while (i < sequences_header.sequence_count) : (i += 1) { |
| 863 | | const decompressed_size = decode_state.decodeSequenceRingBuffer( |
| 864 | | dest, |
| 865 | | &bit_stream, |
| 866 | | sequence_size_limit, |
| 867 | | i == sequences_header.sequence_count - 1, |
| 868 | | ) catch return error.MalformedCompressedBlock; |
| 869 | | sequence_size_limit -= decompressed_size; |
| 870 | | bytes_written += decompressed_size; |
| 861 | if (sequences_header.sequence_count > 0) { |
| 862 | if (sequence_buffer.len < block_reader_limited.bytes_left) |
| 863 | return error.SequenceBufferTooSmall; |
| 864 | |
| 865 | decode_state.readInitialFseState(&bit_stream) catch |
| 866 | return error.MalformedCompressedBlock; |
| 867 | |
| 868 | var sequence_size_limit = block_size_max; |
| 869 | var i: usize = 0; |
| 870 | while (i < sequences_header.sequence_count) : (i += 1) { |
| 871 | const decompressed_size = decode_state.decodeSequenceRingBuffer( |
| 872 | dest, |
| 873 | &bit_stream, |
| 874 | sequence_size_limit, |
| 875 | i == sequences_header.sequence_count - 1, |
| 876 | ) catch return error.MalformedCompressedBlock; |
| 877 | sequence_size_limit -= decompressed_size; |
| 878 | bytes_written += decompressed_size; |
| 879 | } |
| 871 | 880 | } |
| 881 | |
| 872 | 882 | if (!bit_stream.isEmpty()) { |
| 873 | 883 | return error.MalformedCompressedBlock; |
| 874 | 884 | } |