@@ -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 ;
0 commit comments