| ... | ... | @@ -562,7 +562,12 @@ pub fn decodeZStandardFrame(dest: []u8, src: []const u8, verify_checksum: bool) |
| 562 | 562 | /// `decodeZStandardFrame()`. Returns `error.WindowSizeUnknown` if the frame |
| 563 | 563 | /// does not declare its content size or a window descriptor (this indicates a |
| 564 | 564 | /// malformed frame). |
| 565 | | pub fn decodeZStandardFrameAlloc(allocator: std.mem.Allocator, src: []const u8, verify_checksum: bool) ![]u8 { |
| 565 | pub fn decodeZStandardFrameAlloc( |
| 566 | allocator: std.mem.Allocator, |
| 567 | src: []const u8, |
| 568 | verify_checksum: bool, |
| 569 | window_size_max: usize, |
| 570 | ) ![]u8 { |
| 566 | 571 | var result = std.ArrayList(u8).init(allocator); |
| 567 | 572 | assert(readInt(u32, src[0..4]) == frame.ZStandard.magic_number); |
| 568 | 573 | var consumed_count: usize = 4; |
| ... | ... | @@ -572,7 +577,10 @@ pub fn decodeZStandardFrameAlloc(allocator: std.mem.Allocator, src: []const u8, |
| 572 | 577 | if (frame_header.descriptor.dictionary_id_flag != 0) return error.DictionaryIdFlagUnsupported; |
| 573 | 578 | |
| 574 | 579 | const window_size_raw = frameWindowSize(frame_header) orelse return error.WindowSizeUnknown; |
| 575 | | const window_size = std.math.cast(usize, window_size_raw) orelse return error.WindowTooLarge; |
| 580 | const window_size = if (window_size_raw > window_size_max) |
| 581 | return error.WindowTooLarge |
| 582 | else |
| 583 | @intCast(usize, window_size_raw); |
| 576 | 584 | |
| 577 | 585 | const should_compute_checksum = frame_header.descriptor.content_checksum_flag and verify_checksum; |
| 578 | 586 | var hash = if (should_compute_checksum) std.hash.XxHash64.init(0) else null; |