Commit e418197247

Andrew Kelley <andrew@ziglang.org>
2025-08-28 03:41:10
link.MachO: code sig size grows when emitting it
1 parent 5be9df7
Changed files (2)
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();
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(