| ... | @@ -61,10 +61,16 @@ pub fn rescanMac(cb: *Bundle, gpa: Allocator) RescanMacError!void { | ... | @@ -61,10 +61,16 @@ pub fn rescanMac(cb: *Bundle, gpa: Allocator) RescanMacError!void { |
| 61 | } | 61 | } |
| 62 | | 62 | |
| 63 | for (record_list) |record_offset| { | 63 | 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 | |
| 64 | try stream.seekTo(db_header.schema_offset + table_offset + record_offset); | 68 | try stream.seekTo(db_header.schema_offset + table_offset + record_offset); |
| 65 | | 69 | |
| 66 | const cert_header = try reader.readStructEndian(X509CertHeader, .big); | 70 | const cert_header = try reader.readStructEndian(X509CertHeader, .big); |
| 67 | | 71 | |
| | 72 | if (cert_header.cert_size == 0) continue; |
| | 73 | |
| 68 | try cb.bytes.ensureUnusedCapacity(gpa, cert_header.cert_size); | 74 | try cb.bytes.ensureUnusedCapacity(gpa, cert_header.cert_size); |
| 69 | | 75 | |
| 70 | const cert_start = @as(u32, @intCast(cb.bytes.items.len)); | 76 | const cert_start = @as(u32, @intCast(cb.bytes.items.len)); |