authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-08-29 21:16:29-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-08-30 00:48:50-07:00
log07da9567e67643ed3a252ba1d10379ef23a6f682
tree2e15c67b286ca2b9f948f2d4efef18fbe716f8a0
parent9adcc31ca3dafa4799984ceb3409a85501417288

compiler: fix macos build


1 files changed, 49 insertions(+), 43 deletions(-)

lib/std/crypto/Certificate/Bundle/macos.zig+49-43
...@@ -11,75 +11,81 @@ pub fn rescanMac(cb: *Bundle, gpa: Allocator) RescanMacError!void {...@@ -11,75 +11,81 @@ pub fn rescanMac(cb: *Bundle, gpa: Allocator) RescanMacError!void {
11 cb.bytes.clearRetainingCapacity();11 cb.bytes.clearRetainingCapacity();
12 cb.map.clearRetainingCapacity();12 cb.map.clearRetainingCapacity();
1313
14 const keychainPaths = [2][]const u8{14 const keychain_paths = [2][]const u8{
15 "/System/Library/Keychains/SystemRootCertificates.keychain",15 "/System/Library/Keychains/SystemRootCertificates.keychain",
16 "/Library/Keychains/System.keychain",16 "/Library/Keychains/System.keychain",
17 };17 };
1818
19 for (keychainPaths) |keychainPath| {19 for (keychain_paths) |keychain_path| {
20 const file = try fs.openFileAbsolute(keychainPath, .{});20 const bytes = std.fs.cwd().readFileAlloc(keychain_path, gpa, .limited(std.math.maxInt(u32))) catch |err| switch (err) {
21 defer file.close();21 error.StreamTooLong => return error.FileTooBig,
2222 else => |e| return e,
23 const bytes = try file.readToEndAlloc(gpa, std.math.maxInt(u32));23 };
24 defer gpa.free(bytes);24 defer gpa.free(bytes);
2525
26 var reader: std.Io.Reader = .fixed(bytes);26 var reader: std.Io.Reader = .fixed(bytes);
27 scanReader(cb, gpa, &reader) catch |err| switch (err) {
28 error.ReadFailed => unreachable, // prebuffered
29 else => |e| return e,
30 };
31 }
2732
28 const db_header = try reader.takeStruct(ApplDbHeader, .big);33 cb.bytes.shrinkAndFree(gpa, cb.bytes.items.len);
29 assert(mem.eql(u8, &db_header.signature, "kych"));34}
3035
31 reader.seek = db_header.schema_offset;36fn scanReader(cb: *Bundle, gpa: Allocator, reader: *std.Io.Reader) !void {
37 const db_header = try reader.takeStruct(ApplDbHeader, .big);
38 assert(mem.eql(u8, &db_header.signature, "kych"));
3239
33 const db_schema = try reader.takeStruct(ApplDbSchema, .big);40 reader.seek = db_header.schema_offset;
3441
35 var table_list = try gpa.alloc(u32, db_schema.table_count);42 const db_schema = try reader.takeStruct(ApplDbSchema, .big);
36 defer gpa.free(table_list);
3743
38 var table_idx: u32 = 0;44 var table_list = try gpa.alloc(u32, db_schema.table_count);
39 while (table_idx < table_list.len) : (table_idx += 1) {45 defer gpa.free(table_list);
40 table_list[table_idx] = try reader.takeInt(u32, .big);
41 }
4246
43 const now_sec = std.time.timestamp();47 var table_idx: u32 = 0;
48 while (table_idx < table_list.len) : (table_idx += 1) {
49 table_list[table_idx] = try reader.takeInt(u32, .big);
50 }
4451
45 for (table_list) |table_offset| {52 const now_sec = std.time.timestamp();
46 reader.seek = db_header.schema_offset + table_offset;
4753
48 const table_header = try reader.takeStruct(TableHeader, .big);54 for (table_list) |table_offset| {
55 reader.seek = db_header.schema_offset + table_offset;
4956
50 if (@as(std.c.DB_RECORDTYPE, @enumFromInt(table_header.table_id)) != .X509_CERTIFICATE) {57 const table_header = try reader.takeStruct(TableHeader, .big);
51 continue;
52 }
5358
54 var record_list = try gpa.alloc(u32, table_header.record_count);59 if (@as(std.c.DB_RECORDTYPE, @enumFromInt(table_header.table_id)) != .X509_CERTIFICATE) {
55 defer gpa.free(record_list);60 continue;
61 }
62
63 var record_list = try gpa.alloc(u32, table_header.record_count);
64 defer gpa.free(record_list);
5665
57 var record_idx: u32 = 0;66 var record_idx: u32 = 0;
58 while (record_idx < record_list.len) : (record_idx += 1) {67 while (record_idx < record_list.len) : (record_idx += 1) {
59 record_list[record_idx] = try reader.takeInt(u32, .big);68 record_list[record_idx] = try reader.takeInt(u32, .big);
60 }69 }
6170
62 for (record_list) |record_offset| {71 for (record_list) |record_offset| {
63 // An offset of zero means that the record is not present.72 // An offset of zero means that the record is not present.
64 // An offset that is not 4-byte-aligned is invalid.73 // An offset that is not 4-byte-aligned is invalid.
65 if (record_offset == 0 or record_offset % 4 != 0) continue;74 if (record_offset == 0 or record_offset % 4 != 0) continue;
6675
67 reader.seek = db_header.schema_offset + table_offset + record_offset;76 reader.seek = db_header.schema_offset + table_offset + record_offset;
6877
69 const cert_header = try reader.takeStruct(X509CertHeader, .big);78 const cert_header = try reader.takeStruct(X509CertHeader, .big);
7079
71 if (cert_header.cert_size == 0) continue;80 if (cert_header.cert_size == 0) continue;
7281
73 const cert_start = @as(u32, @intCast(cb.bytes.items.len));82 const cert_start: u32 = @intCast(cb.bytes.items.len);
74 const dest_buf = try cb.bytes.addManyAsSlice(gpa, cert_header.cert_size);83 const dest_buf = try cb.bytes.addManyAsSlice(gpa, cert_header.cert_size);
75 try reader.readSliceAll(dest_buf);84 try reader.readSliceAll(dest_buf);
7685
77 try cb.parseCert(gpa, cert_start, now_sec);86 try cb.parseCert(gpa, cert_start, now_sec);
78 }
79 }87 }
80 }88 }
81
82 cb.bytes.shrinkAndFree(gpa, cb.bytes.items.len);
83}89}
8490
85const ApplDbHeader = extern struct {91const ApplDbHeader = extern struct {