authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-28 15:18:43-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-31 22:10:11-07:00
log7bf91d705c241609eb9d459d7556b2fc2afee7a1
treedcf40b088adcf115ed967da774bfe2776ac39a2c
parent73e5594c78a66fb943638d99f8540bec0b5ed839

fix bit read not at eof


1 files changed, 5 insertions(+), 5 deletions(-)

lib/std/compress/flate/Decompress.zig+5-5
...@@ -245,7 +245,8 @@ fn readInner(d: *Decompress, w: *Writer, limit: std.Io.Limit) (Error || Reader.S...@@ -245,7 +245,8 @@ fn readInner(d: *Decompress, w: *Writer, limit: std.Io.Limit) (Error || Reader.S
245 var dec_lens: [286 + 30]u4 = @splat(0);245 var dec_lens: [286 + 30]u4 = @splat(0);
246 var pos: usize = 0;246 var pos: usize = 0;
247 while (pos < hlit + hdist) {247 while (pos < hlit + hdist) {
248 const sym = try cl_dec.find(@bitReverse(try d.peekBits(u7)));248 const peeked = @bitReverse(try d.peekBits(u7));
249 const sym = try cl_dec.find(peeked);
249 try d.tossBits(sym.code_bits);250 try d.tossBits(sym.code_bits);
250 pos += try d.dynamicCodeLength(sym.symbol, &dec_lens, pos);251 pos += try d.dynamicCodeLength(sym.symbol, &dec_lens, pos);
251 }252 }
...@@ -377,7 +378,7 @@ fn takeBits(d: *Decompress, comptime T: type) !T {...@@ -377,7 +378,7 @@ fn takeBits(d: *Decompress, comptime T: type) !T {
377 error.EndOfStream => return takeBitsEnding(d, T),378 error.EndOfStream => return takeBitsEnding(d, T),
378 };379 };
379 const needed_bits = @bitSizeOf(T) - remaining_bits;380 const needed_bits = @bitSizeOf(T) - remaining_bits;
380 const u: U = @intCast((next_bits << needed_bits) | (next_int & ((@as(usize, 1) << needed_bits) - 1)));381 const u: U = @intCast(((next_int & ((@as(usize, 1) << needed_bits) - 1)) << remaining_bits) | next_bits);
381 d.next_bits = next_int >> needed_bits;382 d.next_bits = next_int >> needed_bits;
382 d.remaining_bits = @intCast(@bitSizeOf(usize) - @as(usize, needed_bits));383 d.remaining_bits = @intCast(@bitSizeOf(usize) - @as(usize, needed_bits));
383 return switch (@typeInfo(T)) {384 return switch (@typeInfo(T)) {
...@@ -434,7 +435,7 @@ fn peekBits(d: *Decompress, comptime T: type) !T {...@@ -434,7 +435,7 @@ fn peekBits(d: *Decompress, comptime T: type) !T {
434 error.EndOfStream => return peekBitsEnding(d, T),435 error.EndOfStream => return peekBitsEnding(d, T),
435 };436 };
436 const needed_bits = @bitSizeOf(T) - remaining_bits;437 const needed_bits = @bitSizeOf(T) - remaining_bits;
437 const u: U = @intCast((next_bits << needed_bits) | (next_int & ((@as(usize, 1) << needed_bits) - 1)));438 const u: U = @intCast(((next_int & ((@as(usize, 1) << needed_bits) - 1)) << remaining_bits) | next_bits);
438 return switch (@typeInfo(T)) {439 return switch (@typeInfo(T)) {
439 .int => u,440 .int => u,
440 .@"enum" => @enumFromInt(u),441 .@"enum" => @enumFromInt(u),
...@@ -983,11 +984,10 @@ test "fuzzing tests" {...@@ -983,11 +984,10 @@ test "fuzzing tests" {
983 .{ .input = "puff27", .err = error.InvalidDynamicBlockHeader },984 .{ .input = "puff27", .err = error.InvalidDynamicBlockHeader },
984 };985 };
985986
986 inline for (cases, 0..) |c, case_no| {987 inline for (cases) |c| {
987 var in: Reader = .fixed(@embedFile("testdata/fuzz/" ++ c.input ++ ".input"));988 var in: Reader = .fixed(@embedFile("testdata/fuzz/" ++ c.input ++ ".input"));
988 var aw: Writer.Allocating = .init(testing.allocator);989 var aw: Writer.Allocating = .init(testing.allocator);
989 defer aw.deinit();990 defer aw.deinit();
990 errdefer std.debug.print("test case failed {}\n", .{case_no});
991991
992 var decompress: Decompress = .init(&in, .raw, &.{});992 var decompress: Decompress = .init(&in, .raw, &.{});
993 const r = &decompress.reader;993 const r = &decompress.reader;