authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2020-11-20 17:26:39+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2020-11-26 11:50:09+01:00
logcd79c6dda1457ae9bf69fe900852209e31c28406
tree09e8152b23f78572928f9536939a90ea9b73cfca
parenta6e93da717334b6ee354d162107e00080807ce7c

stage2 macho: fix issues with codesigning


2 files changed, 6 insertions(+), 4 deletions(-)

src/link/MachO.zig+3-1
......@@ -1760,6 +1760,9 @@ fn writeAllUndefSymbols(self: *MachO) !void {
17601760
17611761fn writeCodeSignature(self: *MachO) !void {
17621762 const code_sig_cmd = &self.load_commands.items[self.code_signature_cmd_index.?].LinkeditData;
1763 // Pad out the space. We need to do this to calculate valid hashes for everything in the file
1764 // except for code signature data.
1765 try self.base.file.?.pwriteAll(&[_]u8{0}, code_sig_cmd.dataoff + code_sig_cmd.datasize - 1);
17631766
17641767 var code_sig = CodeSignature.init(self.base.allocator);
17651768 defer code_sig.deinit();
......@@ -1772,7 +1775,6 @@ fn writeCodeSignature(self: *MachO) !void {
17721775 code_sig.write(buffer);
17731776
17741777 try self.base.file.?.pwriteAll(buffer, code_sig_cmd.dataoff);
1775 try self.base.file.?.pwriteAll(&[_]u8{0}, code_sig_cmd.dataoff + code_sig_cmd.datasize - 1);
17761778}
17771779
17781780fn writeExportTrie(self: *MachO) !void {
src/link/MachO/CodeSignature.zig+3-3
......@@ -69,11 +69,12 @@ pub fn calcAdhocSignature(self: *CodeSignature, bin_file: *const MachO) !void {
6969 const text_segment = bin_file.load_commands.items[bin_file.text_segment_cmd_index.?].Segment;
7070 const data_segment = bin_file.load_commands.items[bin_file.data_segment_cmd_index.?].Segment;
7171 const linkedit_segment = bin_file.load_commands.items[bin_file.linkedit_segment_cmd_index.?].Segment;
72 const symtab = bin_file.load_commands.items[bin_file.symtab_cmd_index.?].Symtab;
72 const code_sig_cmd = bin_file.load_commands.items[bin_file.code_signature_cmd_index.?].LinkeditData;
7373
7474 const execSegBase: u64 = text_segment.fileoff;
7575 const execSegLimit: u64 = text_segment.filesize;
7676 const execSegFlags: u64 = if (bin_file.base.options.output_mode == .Exe) macho.CS_EXECSEG_MAIN_BINARY else 0;
77 const file_size = code_sig_cmd.dataoff;
7778 var cdir = CodeDirectory{
7879 .inner = .{
7980 .magic = macho.CSMAGIC_CODEDIRECTORY,
......@@ -84,7 +85,7 @@ pub fn calcAdhocSignature(self: *CodeSignature, bin_file: *const MachO) !void {
8485 .identOffset = 0,
8586 .nSpecialSlots = 0,
8687 .nCodeSlots = 0,
87 .codeLimit = 0,
88 .codeLimit = @intCast(u32, file_size),
8889 .hashSize = hash_size,
8990 .hashType = macho.CS_HASHTYPE_SHA256,
9091 .platform = 0,
......@@ -100,7 +101,6 @@ pub fn calcAdhocSignature(self: *CodeSignature, bin_file: *const MachO) !void {
100101 },
101102 };
102103
103 const file_size = symtab.stroff + symtab.strsize;
104104 const total_pages = mem.alignForward(file_size, page_size) / page_size;
105105 log.debug("Total file size: {}; total number of pages: {}\n", .{ file_size, total_pages });
106106