authorgravatar for squeek502@hotmail.comRyan Liptak <squeek502@hotmail.com> 2025-08-08 01:37:59-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-08-08 12:27:25-07:00
log23fff3442de38877c556f3cda19f3cccef255f7a
tree1ccef586bab59ea7f7ddd805d8c8c785f00b5754
parentd984e7d2fa4a88a86deff36f33c70b2f4ced7d02

flate: Handle invalid block type

Fixes `panic: invalid enum value` when the type bits had the u2 value of 3. Contributes towards #24741

1 files changed, 7 insertions(+), 0 deletions(-)

lib/std/compress/flate/Decompress.zig+7
......@@ -31,6 +31,7 @@ const BlockType = enum(u2) {
3131 stored = 0,
3232 fixed = 1,
3333 dynamic = 2,
34 invalid = 3,
3435};
3536
3637const State = union(enum) {
......@@ -49,6 +50,7 @@ pub const Error = Container.Error || error{
4950 InvalidCode,
5051 InvalidMatch,
5152 WrongStoredBlockNlen,
53 InvalidBlockType,
5254 InvalidDynamicBlockHeader,
5355 ReadFailed,
5456 OversubscribedHuffmanTree,
......@@ -360,6 +362,7 @@ fn streamInner(d: *Decompress, w: *Writer, limit: std.Io.Limit) (Error || Reader
360362
361363 continue :sw .dynamic_block;
362364 },
365 .invalid => return error.InvalidBlockType,
363366 }
364367 },
365368 .stored_block => |remaining_len| {
......@@ -1141,6 +1144,10 @@ test "puff09" {
11411144 try testDecompress(.raw, @embedFile("testdata/fuzz/puff09.input"), "P");
11421145}
11431146
1147test "invalid block type" {
1148 try testFailure(.raw, &[_]u8{0b110}, error.InvalidBlockType);
1149}
1150
11441151test "bug 18966" {
11451152 try testDecompress(
11461153 .gzip,