diff --git a/lib/std/compress/flate/Decompress.zig b/lib/std/compress/flate/Decompress.zig index 7c58905ee1..a4bb4f291d 100644 --- a/lib/std/compress/flate/Decompress.zig +++ b/lib/std/compress/flate/Decompress.zig @@ -25,8 +25,7 @@ state: State, err: ?Error, -/// TODO: change this to usize -const Bits = u64; +const Bits = usize; const BlockType = enum(u2) { stored = 0, @@ -550,29 +549,19 @@ fn peekBitsEnding(d: *Decompress, comptime U: type) !U { var u: Bits = 0; var remaining_needed_bits = @bitSizeOf(U) - remaining_bits; var i: usize = 0; - while (remaining_needed_bits >= 8) { - const byte = try specialPeek(in, next_bits, i); - u |= @as(Bits, byte) << @intCast(i * 8); - remaining_needed_bits -= 8; + while (remaining_needed_bits > 0) { + const peeked = in.peek(i + 1) catch |err| switch (err) { + error.ReadFailed => return error.ReadFailed, + error.EndOfStream => break, + }; + u |= @as(Bits, peeked[i]) << @intCast(i * 8); + remaining_needed_bits -|= 8; i += 1; } - if (remaining_needed_bits != 0) { - const byte = try specialPeek(in, next_bits, i); - u |= @as(Bits, byte) << @intCast((i * 8) + remaining_needed_bits); - } + if (remaining_bits == 0 and i == 0) return error.EndOfStream; return @truncate((u << remaining_bits) | next_bits); } -/// If there is any unconsumed data, handles EndOfStream by pretending there -/// are zeroes afterwards. -fn specialPeek(in: *Reader, next_bits: Bits, i: usize) Reader.Error!u8 { - const peeked = in.peek(i + 1) catch |err| switch (err) { - error.ReadFailed => return error.ReadFailed, - error.EndOfStream => if (next_bits == 0 and i == 0) return error.EndOfStream else return 0, - }; - return peeked[i]; -} - fn tossBits(d: *Decompress, n: u4) !void { const remaining_bits = d.remaining_bits; const next_bits = d.next_bits; @@ -1032,7 +1021,7 @@ test "failing invalid-tree01" { try testFailure(.raw, @embedFile("testdata/fuzz/invalid-tree01.input"), error.IncompleteHuffmanTree); } test "failing invalid-tree02" { - try testFailure(.raw, @embedFile("testdata/fuzz/invalid-tree02.input"), error.EndOfStream); + try testFailure(.raw, @embedFile("testdata/fuzz/invalid-tree02.input"), error.IncompleteHuffmanTree); } test "failing invalid-tree03" { try testFailure(.raw, @embedFile("testdata/fuzz/invalid-tree03.input"), error.IncompleteHuffmanTree); @@ -1065,7 +1054,7 @@ test "failing puff10" { try testFailure(.raw, @embedFile("testdata/fuzz/puff10.input"), error.InvalidCode); } test "failing puff11" { - try testFailure(.raw, @embedFile("testdata/fuzz/puff11.input"), error.EndOfStream); + try testFailure(.raw, @embedFile("testdata/fuzz/puff11.input"), error.InvalidMatch); } test "failing puff12" { try testFailure(.raw, @embedFile("testdata/fuzz/puff12.input"), error.InvalidDynamicBlockHeader); @@ -1137,7 +1126,7 @@ test "deflate-stream" { } test "empty-distance-alphabet01" { - try testFailure(.raw, @embedFile("testdata/fuzz/empty-distance-alphabet01.input"), error.EndOfStream); + try testDecompress(.raw, @embedFile("testdata/fuzz/empty-distance-alphabet01.input"), ""); } test "empty-distance-alphabet02" {