From e4181972470c29f83480fdd6d5a465e1f8d14d7b Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Wed, 27 Aug 2025 18:41:10 -0700 Subject: [PATCH] link.MachO: code sig size grows when emitting it --- src/link/MachO.zig | 22 ++++++++++++++-------- src/link/MachO/CodeSignature.zig | 2 +- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/link/MachO.zig b/src/link/MachO.zig index 33261ac9b0..43be35994f 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -3015,24 +3015,30 @@ pub fn writeCodeSignature(self: *MachO, code_sig: *CodeSignature) !void { const offset = self.codesig_cmd.dataoff; const gpa = self.base.comp.gpa; - const buffer = try gpa.alloc(u8, code_sig.size()); - defer gpa.free(buffer); - var writer: Writer = .fixed(buffer); - try code_sig.writeAdhocSignature(self, .{ + var buffer: std.Io.Writer.Allocating = .init(gpa); + defer buffer.deinit(); + // The writeAdhocSignature function internally changes code_sig.size() + // during the execution. + try buffer.ensureUnusedCapacity(code_sig.size()); + + code_sig.writeAdhocSignature(self, .{ .file = self.base.file.?, .exec_seg_base = seg.fileoff, .exec_seg_limit = seg.filesize, .file_size = offset, .dylib = self.base.isDynLib(), - }, &writer); - assert(writer.buffered().len == code_sig.size()); + }, &buffer.writer) catch |err| switch (err) { + error.WriteFailed => return error.OutOfMemory, + else => |e| return e, + }; + assert(buffer.written().len == code_sig.size()); log.debug("writing code signature from 0x{x} to 0x{x}", .{ offset, - offset + writer.buffered().len, + offset + buffer.written().len, }); - try self.pwriteAll(writer.buffered(), offset); + try self.pwriteAll(buffer.written(), offset); } pub fn updateFunc( diff --git a/src/link/MachO/CodeSignature.zig b/src/link/MachO/CodeSignature.zig index 158777b896..25addd8cdc 100644 --- a/src/link/MachO/CodeSignature.zig +++ b/src/link/MachO/CodeSignature.zig @@ -263,7 +263,7 @@ pub fn writeAdhocSignature( self: *CodeSignature, macho_file: *MachO, opts: WriteOpts, - writer: anytype, + writer: *std.Io.Writer, ) !void { const tracy = trace(@src()); defer tracy.end();