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 {...@@ -1760,6 +1760,9 @@ fn writeAllUndefSymbols(self: *MachO) !void {
17601760
1761fn writeCodeSignature(self: *MachO) !void {1761fn writeCodeSignature(self: *MachO) !void {
1762 const code_sig_cmd = &self.load_commands.items[self.code_signature_cmd_index.?].LinkeditData;1762 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
1764 var code_sig = CodeSignature.init(self.base.allocator);1767 var code_sig = CodeSignature.init(self.base.allocator);
1765 defer code_sig.deinit();1768 defer code_sig.deinit();
...@@ -1772,7 +1775,6 @@ fn writeCodeSignature(self: *MachO) !void {...@@ -1772,7 +1775,6 @@ fn writeCodeSignature(self: *MachO) !void {
1772 code_sig.write(buffer);1775 code_sig.write(buffer);
17731776
1774 try self.base.file.?.pwriteAll(buffer, code_sig_cmd.dataoff);1777 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);
1776}1778}
17771779
1778fn writeExportTrie(self: *MachO) !void {1780fn 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 {...@@ -69,11 +69,12 @@ pub fn calcAdhocSignature(self: *CodeSignature, bin_file: *const MachO) !void {
69 const text_segment = bin_file.load_commands.items[bin_file.text_segment_cmd_index.?].Segment;69 const text_segment = bin_file.load_commands.items[bin_file.text_segment_cmd_index.?].Segment;
70 const data_segment = bin_file.load_commands.items[bin_file.data_segment_cmd_index.?].Segment;70 const data_segment = bin_file.load_commands.items[bin_file.data_segment_cmd_index.?].Segment;
71 const linkedit_segment = bin_file.load_commands.items[bin_file.linkedit_segment_cmd_index.?].Segment;71 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
74 const execSegBase: u64 = text_segment.fileoff;74 const execSegBase: u64 = text_segment.fileoff;
75 const execSegLimit: u64 = text_segment.filesize;75 const execSegLimit: u64 = text_segment.filesize;
76 const execSegFlags: u64 = if (bin_file.base.options.output_mode == .Exe) macho.CS_EXECSEG_MAIN_BINARY else 0;76 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;
77 var cdir = CodeDirectory{78 var cdir = CodeDirectory{
78 .inner = .{79 .inner = .{
79 .magic = macho.CSMAGIC_CODEDIRECTORY,80 .magic = macho.CSMAGIC_CODEDIRECTORY,
...@@ -84,7 +85,7 @@ pub fn calcAdhocSignature(self: *CodeSignature, bin_file: *const MachO) !void {...@@ -84,7 +85,7 @@ pub fn calcAdhocSignature(self: *CodeSignature, bin_file: *const MachO) !void {
84 .identOffset = 0,85 .identOffset = 0,
85 .nSpecialSlots = 0,86 .nSpecialSlots = 0,
86 .nCodeSlots = 0,87 .nCodeSlots = 0,
87 .codeLimit = 0,88 .codeLimit = @intCast(u32, file_size),
88 .hashSize = hash_size,89 .hashSize = hash_size,
89 .hashType = macho.CS_HASHTYPE_SHA256,90 .hashType = macho.CS_HASHTYPE_SHA256,
90 .platform = 0,91 .platform = 0,
...@@ -100,7 +101,6 @@ pub fn calcAdhocSignature(self: *CodeSignature, bin_file: *const MachO) !void {...@@ -100,7 +101,6 @@ pub fn calcAdhocSignature(self: *CodeSignature, bin_file: *const MachO) !void {
100 },101 },
101 };102 };
102103
103 const file_size = symtab.stroff + symtab.strsize;
104 const total_pages = mem.alignForward(file_size, page_size) / page_size;104 const total_pages = mem.alignForward(file_size, page_size) / page_size;
105 log.debug("Total file size: {}; total number of pages: {}\n", .{ file_size, total_pages });105 log.debug("Total file size: {}; total number of pages: {}\n", .{ file_size, total_pages });
106106