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