authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-10-26 13:18:44-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-10-26 13:18:44-07:00
loge83334274f1d35690e4546938aff065397347943
tree966c50176b9b62b2c89695463fc29bfdf8ac90bd
parent194e29adfccbd5076a3523572c7e119d4bfa647d

add regression test for already fixed bug

closes #6781

2 files changed, 75 insertions(+), 0 deletions(-)

test/stage1/behavior.zig+1
...@@ -53,6 +53,7 @@ comptime {...@@ -53,6 +53,7 @@ comptime {
53 _ = @import("behavior/bugs/5413.zig");53 _ = @import("behavior/bugs/5413.zig");
54 _ = @import("behavior/bugs/5474.zig");54 _ = @import("behavior/bugs/5474.zig");
55 _ = @import("behavior/bugs/5487.zig");55 _ = @import("behavior/bugs/5487.zig");
56 _ = @import("behavior/bugs/6781.zig");
56 _ = @import("behavior/bugs/394.zig");57 _ = @import("behavior/bugs/394.zig");
57 _ = @import("behavior/bugs/421.zig");58 _ = @import("behavior/bugs/421.zig");
58 _ = @import("behavior/bugs/529.zig");59 _ = @import("behavior/bugs/529.zig");
test/stage1/behavior/bugs/6781.zig created+74
...@@ -0,0 +1,74 @@
1const std = @import("std");
2const assert = std.debug.assert;
3
4const segfault = true;
5
6pub const JournalHeader = packed struct {
7 hash_chain_root: u128 = undefined,
8 prev_hash_chain_root: u128,
9 checksum: u128 = undefined,
10 magic: u64,
11 command: u32,
12 size: u32,
13
14 pub fn calculate_checksum(self: *const JournalHeader, entry: []const u8) u128 {
15 assert(entry.len >= @sizeOf(JournalHeader));
16 assert(entry.len == self.size);
17
18 const checksum_offset = @byteOffsetOf(JournalHeader, "checksum");
19 const checksum_size = @sizeOf(@TypeOf(self.checksum));
20 assert(checksum_offset == 0 + 16 + 16);
21 assert(checksum_size == 16);
22
23 var target: [32]u8 = undefined;
24 std.crypto.hash.Blake3.hash(entry[checksum_offset + checksum_size ..], target[0..], .{});
25 return @bitCast(u128, target[0..checksum_size].*);
26 }
27
28 pub fn calculate_hash_chain_root(self: *const JournalHeader) u128 {
29 const hash_chain_root_size = @sizeOf(@TypeOf(self.hash_chain_root));
30 assert(hash_chain_root_size == 16);
31
32 const prev_hash_chain_root_offset = @byteOffsetOf(JournalHeader, "prev_hash_chain_root");
33 const prev_hash_chain_root_size = @sizeOf(@TypeOf(self.prev_hash_chain_root));
34 assert(prev_hash_chain_root_offset == 0 + 16);
35 assert(prev_hash_chain_root_size == 16);
36
37 const checksum_offset = @byteOffsetOf(JournalHeader, "checksum");
38 const checksum_size = @sizeOf(@TypeOf(self.checksum));
39 assert(checksum_offset == 0 + 16 + 16);
40 assert(checksum_size == 16);
41
42 assert(prev_hash_chain_root_offset + prev_hash_chain_root_size == checksum_offset);
43
44 const header = @bitCast([@sizeOf(JournalHeader)]u8, self.*);
45 const source = header[prev_hash_chain_root_offset .. checksum_offset + checksum_size];
46 assert(source.len == prev_hash_chain_root_size + checksum_size);
47 var target: [32]u8 = undefined;
48 std.crypto.hash.Blake3.hash(source, target[0..], .{});
49 if (segfault) {
50 return @bitCast(u128, target[0..hash_chain_root_size].*);
51 } else {
52 var array = target[0..hash_chain_root_size].*;
53 return @bitCast(u128, array);
54 }
55 }
56
57 pub fn set_checksum_and_hash_chain_root(self: *JournalHeader, entry: []const u8) void {
58 self.checksum = self.calculate_checksum(entry);
59 self.hash_chain_root = self.calculate_hash_chain_root();
60 }
61};
62
63test "fixed" {
64 var buffer = [_]u8{0} ** 65536;
65 var entry = std.mem.bytesAsValue(JournalHeader, buffer[0..@sizeOf(JournalHeader)]);
66 entry.* = .{
67 .prev_hash_chain_root = 0,
68 .magic = 0,
69 .command = 0,
70 .size = 64 + 128,
71 };
72 entry.set_checksum_and_hash_chain_root(buffer[0..entry.size]);
73 try std.io.null_writer.print("{}\n", .{entry});
74}