| ... | @@ -73,14 +73,20 @@ pub fn isArchive(path: []const u8, fat_arch: ?fat.Arch) !bool { | ... | @@ -73,14 +73,20 @@ pub fn isArchive(path: []const u8, fat_arch: ?fat.Arch) !bool { |
| 73 | } | 73 | } |
| 74 | | 74 | |
| 75 | pub fn deinit(self: *Archive, allocator: Allocator) void { | 75 | pub fn deinit(self: *Archive, allocator: Allocator) void { |
| | 76 | allocator.free(self.data); |
| | 77 | allocator.free(self.path); |
| 76 | self.objects.deinit(allocator); | 78 | self.objects.deinit(allocator); |
| 77 | } | 79 | } |
| 78 | | 80 | |
| 79 | pub fn parse(self: *Archive, arena: Allocator, macho_file: *MachO) !void { | 81 | pub fn parse(self: *Archive, macho_file: *MachO) !void { |
| 80 | const gpa = macho_file.base.allocator; | 82 | const gpa = macho_file.base.comp.gpa; |
| | 83 | |
| | 84 | var arena = std.heap.ArenaAllocator.init(gpa); |
| | 85 | defer arena.deinit(); |
| 81 | | 86 | |
| 82 | var stream = std.io.fixedBufferStream(self.data); | 87 | var stream = std.io.fixedBufferStream(self.data); |
| 83 | const reader = stream.reader(); | 88 | const reader = stream.reader(); |
| | 89 | _ = try reader.readBytesNoEof(SARMAG); |
| 84 | | 90 | |
| 85 | while (true) { | 91 | while (true) { |
| 86 | if (stream.pos >= self.data.len) break; | 92 | if (stream.pos >= self.data.len) break; |
| ... | @@ -89,18 +95,18 @@ pub fn parse(self: *Archive, arena: Allocator, macho_file: *MachO) !void { | ... | @@ -89,18 +95,18 @@ pub fn parse(self: *Archive, arena: Allocator, macho_file: *MachO) !void { |
| 89 | const hdr = try reader.readStruct(ar_hdr); | 95 | const hdr = try reader.readStruct(ar_hdr); |
| 90 | | 96 | |
| 91 | if (!mem.eql(u8, &hdr.ar_fmag, ARFMAG)) { | 97 | if (!mem.eql(u8, &hdr.ar_fmag, ARFMAG)) { |
| 92 | macho_file.base.fatal("{s}: invalid header delimiter: expected '{s}', found '{s}'", .{ | 98 | try macho_file.reportParseError(self.path, "invalid header delimiter: expected '{s}', found '{s}'", .{ |
| 93 | self.path, std.fmt.fmtSliceEscapeLower(ARFMAG), std.fmt.fmtSliceEscapeLower(&hdr.ar_fmag), | 99 | std.fmt.fmtSliceEscapeLower(ARFMAG), std.fmt.fmtSliceEscapeLower(&hdr.ar_fmag), |
| 94 | }); | 100 | }); |
| 95 | return error.ParseFailed; | 101 | return error.MalformedArchive; |
| 96 | } | 102 | } |
| 97 | | 103 | |
| 98 | var size = try hdr.size(); | 104 | var size = try hdr.size(); |
| 99 | const name = name: { | 105 | const name = name: { |
| 100 | if (hdr.name()) |n| break :name try arena.dupe(u8, n); | 106 | if (hdr.name()) |n| break :name n; |
| 101 | if (try hdr.nameLength()) |len| { | 107 | if (try hdr.nameLength()) |len| { |
| 102 | size -= len; | 108 | size -= len; |
| 103 | const buf = try arena.alloc(u8, len); | 109 | const buf = try arena.allocator().alloc(u8, len); |
| 104 | try reader.readNoEof(buf); | 110 | try reader.readNoEof(buf); |
| 105 | const actual_len = mem.indexOfScalar(u8, buf, @as(u8, 0)) orelse len; | 111 | const actual_len = mem.indexOfScalar(u8, buf, @as(u8, 0)) orelse len; |
| 106 | break :name buf[0..actual_len]; | 112 | break :name buf[0..actual_len]; |
| ... | @@ -114,9 +120,9 @@ pub fn parse(self: *Archive, arena: Allocator, macho_file: *MachO) !void { | ... | @@ -114,9 +120,9 @@ pub fn parse(self: *Archive, arena: Allocator, macho_file: *MachO) !void { |
| 114 | if (mem.eql(u8, name, "__.SYMDEF") or mem.eql(u8, name, "__.SYMDEF SORTED")) continue; | 120 | if (mem.eql(u8, name, "__.SYMDEF") or mem.eql(u8, name, "__.SYMDEF SORTED")) continue; |
| 115 | | 121 | |
| 116 | const object = Object{ | 122 | const object = Object{ |
| 117 | .archive = self.path, | 123 | .archive = try gpa.dupe(u8, self.path), |
| 118 | .path = name, | 124 | .path = try gpa.dupe(u8, name), |
| 119 | .data = self.data[stream.pos..][0..size], | 125 | .data = try gpa.dupe(u8, self.data[stream.pos..][0..size]), |
| 120 | .index = undefined, | 126 | .index = undefined, |
| 121 | .alive = false, | 127 | .alive = false, |
| 122 | .mtime = hdr.date() catch 0, | 128 | .mtime = hdr.date() catch 0, |