Skip to content

Commit 0779e84

Browse files
squeek502alexrp
authored andcommitted
Skip empty/invalid records/certs in MacOS keychain files
In the original PR that implemented this (#14325), it included a list of references for the keychain format. Multiple of those references include the checks that are added in this commit, and empirically this fixes the loading of a real keychain file that was previously failing (it had both a record with offset 0 and a record with cert_size 0). Fixes #22870
1 parent d2e70ef commit 0779e84

File tree

1 file changed

+6
-0
lines changed

1 file changed

+6
-0
lines changed

lib/std/crypto/Certificate/Bundle/macos.zig

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,16 @@ pub fn rescanMac(cb: *Bundle, gpa: Allocator) RescanMacError!void {
6161
}
6262

6363
for (record_list) |record_offset| {
64+
// An offset of zero means that the record is not present.
65+
// An offset that is not 4-byte-aligned is invalid.
66+
if (record_offset == 0 or record_offset % 4 != 0) continue;
67+
6468
try stream.seekTo(db_header.schema_offset + table_offset + record_offset);
6569

6670
const cert_header = try reader.readStructEndian(X509CertHeader, .big);
6771

72+
if (cert_header.cert_size == 0) continue;
73+
6874
try cb.bytes.ensureUnusedCapacity(gpa, cert_header.cert_size);
6975

7076
const cert_start = @as(u32, @intCast(cb.bytes.items.len));

0 commit comments

Comments
 (0)