authorgravatar for 4678790+dweiller@users.noreply.github.comDominic <4678790+dweiller@users.noreply.github.com> 2023-01-26 17:12:40+11:00
committergravatar for 4678790+dweiller@users.noreply.github.comDominic <4678790+dweiller@users.noreply.github.com> 2023-02-20 09:09:06+11:00
log1e5b8be5099d976628aaa3fc4208a0bbd45c7700
treebc7d31255487d1e4acb0033eb00257fdd44d9f6f
parente2306ef0a027ab6257613dad234551a013729de3

std.compress.zstandard: add window size limit param


1 files changed, 10 insertions(+), 2 deletions(-)

lib/std/compress/zstandard/decompress.zig+10-2
......@@ -562,7 +562,12 @@ pub fn decodeZStandardFrame(dest: []u8, src: []const u8, verify_checksum: bool)
562562/// `decodeZStandardFrame()`. Returns `error.WindowSizeUnknown` if the frame
563563/// does not declare its content size or a window descriptor (this indicates a
564564/// malformed frame).
565pub fn decodeZStandardFrameAlloc(allocator: std.mem.Allocator, src: []const u8, verify_checksum: bool) ![]u8 {
565pub fn decodeZStandardFrameAlloc(
566 allocator: std.mem.Allocator,
567 src: []const u8,
568 verify_checksum: bool,
569 window_size_max: usize,
570) ![]u8 {
566571 var result = std.ArrayList(u8).init(allocator);
567572 assert(readInt(u32, src[0..4]) == frame.ZStandard.magic_number);
568573 var consumed_count: usize = 4;
......@@ -572,7 +577,10 @@ pub fn decodeZStandardFrameAlloc(allocator: std.mem.Allocator, src: []const u8,
572577 if (frame_header.descriptor.dictionary_id_flag != 0) return error.DictionaryIdFlagUnsupported;
573578
574579 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);
576584
577585 const should_compute_checksum = frame_header.descriptor.content_checksum_flag and verify_checksum;
578586 var hash = if (should_compute_checksum) std.hash.XxHash64.init(0) else null;