Commit 1a862175d5

dweiller <4678790+dweiller@users.noreplay.github.com>
2023-02-13 08:02:25
std.compress.zstandard: fix zstandardStream content size validation
1 parent 12aa478
Changed files (2)
lib
std
compress
lib/std/compress/zstandard/decompress.zig
@@ -497,6 +497,11 @@ pub fn decodeZstandardFrameBlocksArrayList(
             &consumed_count,
             frame_context.block_size_max,
         );
+        if (frame_context.content_size) |size| {
+            if (dest.items.len - initial_len > size) {
+                return error.BadContentSize;
+            }
+        }
         if (written_size > 0) {
             const written_slice = ring_buffer.sliceLast(written_size);
             try dest.appendSlice(written_slice.first);
@@ -508,9 +513,8 @@ pub fn decodeZstandardFrameBlocksArrayList(
         }
         if (block_header.last_block) break;
     }
-    const added_len = dest.items.len - initial_len;
     if (frame_context.content_size) |size| {
-        if (added_len != size) {
+        if (dest.items.len - initial_len != size) {
             return error.BadContentSize;
         }
     }
lib/std/compress/zstandard.zig
@@ -177,9 +177,14 @@ pub fn ZstandardStream(
                 ) catch
                     return error.MalformedBlock;
 
+                if (self.frame_context.content_size) |size| {
+                    if (self.current_frame_decompressed_size > size) return error.MalformedFrame;
+                }
+
+                const size = self.buffer.len();
+                self.current_frame_decompressed_size += size;
+
                 if (self.frame_context.hasher_opt) |*hasher| {
-                    const size = self.buffer.len();
-                    self.current_frame_decompressed_size += size;
                     if (size > 0) {
                         const written_slice = self.buffer.sliceLast(size);
                         hasher.update(written_slice.first);