| ... | @@ -3015,24 +3015,30 @@ pub fn writeCodeSignature(self: *MachO, code_sig: *CodeSignature) !void { | ... | @@ -3015,24 +3015,30 @@ pub fn writeCodeSignature(self: *MachO, code_sig: *CodeSignature) !void { |
| 3015 | const offset = self.codesig_cmd.dataoff; | 3015 | const offset = self.codesig_cmd.dataoff; |
| 3016 | const gpa = self.base.comp.gpa; | 3016 | const gpa = self.base.comp.gpa; |
| 3017 | | 3017 | |
| 3018 | const buffer = try gpa.alloc(u8, code_sig.size()); | 3018 | var buffer: std.Io.Writer.Allocating = .init(gpa); |
| 3019 | defer gpa.free(buffer); | 3019 | defer buffer.deinit(); |
| 3020 | var writer: Writer = .fixed(buffer); | 3020 | // The writeAdhocSignature function internally changes code_sig.size() |
| 3021 | try code_sig.writeAdhocSignature(self, .{ | 3021 | // during the execution. |
| | 3022 | try buffer.ensureUnusedCapacity(code_sig.size()); |
| | 3023 | |
| | 3024 | code_sig.writeAdhocSignature(self, .{ |
| 3022 | .file = self.base.file.?, | 3025 | .file = self.base.file.?, |
| 3023 | .exec_seg_base = seg.fileoff, | 3026 | .exec_seg_base = seg.fileoff, |
| 3024 | .exec_seg_limit = seg.filesize, | 3027 | .exec_seg_limit = seg.filesize, |
| 3025 | .file_size = offset, | 3028 | .file_size = offset, |
| 3026 | .dylib = self.base.isDynLib(), | 3029 | .dylib = self.base.isDynLib(), |
| 3027 | }, &writer); | 3030 | }, &buffer.writer) catch |err| switch (err) { |
| 3028 | assert(writer.buffered().len == code_sig.size()); | 3031 | error.WriteFailed => return error.OutOfMemory, |
| | 3032 | else => |e| return e, |
| | 3033 | }; |
| | 3034 | assert(buffer.written().len == code_sig.size()); |
| 3029 | | 3035 | |
| 3030 | log.debug("writing code signature from 0x{x} to 0x{x}", .{ | 3036 | log.debug("writing code signature from 0x{x} to 0x{x}", .{ |
| 3031 | offset, | 3037 | offset, |
| 3032 | offset + writer.buffered().len, | 3038 | offset + buffer.written().len, |
| 3033 | }); | 3039 | }); |
| 3034 | | 3040 | |
| 3035 | try self.pwriteAll(writer.buffered(), offset); | 3041 | try self.pwriteAll(buffer.written(), offset); |
| 3036 | } | 3042 | } |
| 3037 | | 3043 | |
| 3038 | pub fn updateFunc( | 3044 | pub fn updateFunc( |