authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-06-19 22:28:03+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-06-19 22:50:08+02:00
log22540e5402799d1c4ee12b5163744cf7431a4c2c
tree87cbe3fc96ad976fb6fe07a8e35195560622babc
parentef9d6331fc9067f7ba47eccee204fa2f0c5d0a18

macho: exclude code signature padding from uuid calculation


3 files changed, 16 insertions(+), 11 deletions(-)

src/link/MachO.zig+6-4
......@@ -769,7 +769,7 @@ pub fn flushModule(self: *MachO, comp: *Compilation, prog_node: *std.Progress.No
769769 const ncmds = load_commands.calcNumOfLCs(lc_buffer.items);
770770 try self.base.file.?.pwriteAll(lc_buffer.items, @sizeOf(macho.mach_header_64));
771771 try self.writeHeader(ncmds, @intCast(u32, lc_buffer.items.len));
772 try self.writeUuid(comp, uuid_cmd_offset);
772 try self.writeUuid(comp, uuid_cmd_offset, requires_codesig);
773773
774774 if (codesig) |*csig| {
775775 try self.writeCodeSignature(comp, csig); // code signing always comes last
......@@ -3507,9 +3507,11 @@ fn writeDysymtab(self: *MachO, ctx: SymtabCtx) !void {
35073507 self.dysymtab_cmd.nindirectsyms = nindirectsyms;
35083508}
35093509
3510fn writeUuid(self: *MachO, comp: *const Compilation, uuid_cmd_offset: u32) !void {
3511 const seg = self.getLinkeditSegmentPtr();
3512 const file_size = seg.fileoff + seg.filesize;
3510fn writeUuid(self: *MachO, comp: *const Compilation, uuid_cmd_offset: u32, has_codesig: bool) !void {
3511 const file_size = if (!has_codesig) blk: {
3512 const seg = self.getLinkeditSegmentPtr();
3513 break :blk seg.fileoff + seg.filesize;
3514 } else self.codesig_cmd.dataoff;
35133515 try calcUuid(comp, self.base.file.?, file_size, &self.uuid_cmd.uuid);
35143516 const offset = uuid_cmd_offset + @sizeOf(macho.load_command);
35153517 try self.base.file.?.pwriteAll(&self.uuid_cmd.uuid, offset);
src/link/MachO/uuid.zig+4-3
......@@ -15,9 +15,10 @@ const Hasher = @import("hasher.zig").ParallelHasher;
1515/// output files. Should we also do that?
1616pub fn calcUuid(comp: *const Compilation, file: fs.File, file_size: u64, out: *[Md5.digest_length]u8) !void {
1717 const num_chunks = comp.thread_pool.threads.len * 0x10;
18 const chunk_size = @divTrunc(file_size + num_chunks - 1, num_chunks);
18 const chunk_size = @divTrunc(file_size, num_chunks);
19 const actual_num_chunks = if (@rem(file_size, num_chunks) > 0) num_chunks + 1 else num_chunks;
1920
20 const hashes = try comp.gpa.alloc([Md5.digest_length]u8, num_chunks);
21 const hashes = try comp.gpa.alloc([Md5.digest_length]u8, actual_num_chunks);
2122 defer comp.gpa.free(hashes);
2223
2324 var hasher = Hasher(Md5){ .allocator = comp.gpa, .thread_pool = comp.thread_pool };
......@@ -26,7 +27,7 @@ pub fn calcUuid(comp: *const Compilation, file: fs.File, file_size: u64, out: *[
2627 .max_file_size = file_size,
2728 });
2829
29 const final_buffer = try comp.gpa.alloc(u8, num_chunks * Md5.digest_length);
30 const final_buffer = try comp.gpa.alloc(u8, actual_num_chunks * Md5.digest_length);
3031 defer comp.gpa.free(final_buffer);
3132
3233 for (hashes, 0..) |hash, i| {
src/link/MachO/zld.zig+6-4
......@@ -2576,9 +2576,11 @@ pub const Zld = struct {
25762576 self.dysymtab_cmd.nindirectsyms = nindirectsyms;
25772577 }
25782578
2579 fn writeUuid(self: *Zld, comp: *const Compilation, uuid_cmd_offset: u32) !void {
2580 const seg = self.getLinkeditSegmentPtr();
2581 const file_size = seg.fileoff + seg.filesize;
2579 fn writeUuid(self: *Zld, comp: *const Compilation, uuid_cmd_offset: u32, has_codesig: bool) !void {
2580 const file_size = if (!has_codesig) blk: {
2581 const seg = self.getLinkeditSegmentPtr();
2582 break :blk seg.fileoff + seg.filesize;
2583 } else self.codesig_cmd.dataoff;
25822584 try calcUuid(comp, self.file, file_size, &self.uuid_cmd.uuid);
25832585 const offset = uuid_cmd_offset + @sizeOf(macho.load_command);
25842586 try self.file.pwriteAll(&self.uuid_cmd.uuid, offset);
......@@ -3953,7 +3955,7 @@ pub fn linkWithZld(macho_file: *MachO, comp: *Compilation, prog_node: *std.Progr
39533955 const ncmds = load_commands.calcNumOfLCs(lc_buffer.items);
39543956 try zld.file.pwriteAll(lc_buffer.items, @sizeOf(macho.mach_header_64));
39553957 try zld.writeHeader(ncmds, @intCast(u32, lc_buffer.items.len));
3956 try zld.writeUuid(comp, uuid_cmd_offset);
3958 try zld.writeUuid(comp, uuid_cmd_offset, requires_codesig);
39573959
39583960 if (codesig) |*csig| {
39593961 try zld.writeCodeSignature(comp, csig); // code signing always comes last