authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-12-05 14:11:45+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-12-05 14:11:45+01:00
logb294103c7ed9892c54800b00d054619177d35839
tree3bb3ee188d289ad0bedf4ab18dd61ff625f791ab
parent52959bba7cdfc763c192d4a713b810fda80ccd02

elf: report malformed archive when parsing errors


2 files changed, 10 insertions(+), 12 deletions(-)

src/link/Elf.zig+6-6
...@@ -1042,7 +1042,7 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node...@@ -1042,7 +1042,7 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node
10421042
1043 for (positionals.items) |obj| {1043 for (positionals.items) |obj| {
1044 self.parsePositional(obj.path, obj.must_link) catch |err| switch (err) {1044 self.parsePositional(obj.path, obj.must_link) catch |err| switch (err) {
1045 error.MalformedObject, error.InvalidCpuArch => {}, // already reported1045 error.MalformedObject, error.MalformedArchive, error.InvalidCpuArch => {}, // already reported
1046 else => |e| try self.reportParseError(1046 else => |e| try self.reportParseError(
1047 obj.path,1047 obj.path,
1048 "unexpected error: parsing input file failed with error {s}",1048 "unexpected error: parsing input file failed with error {s}",
...@@ -1128,7 +1128,7 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node...@@ -1128,7 +1128,7 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node
11281128
1129 for (system_libs.items) |lib| {1129 for (system_libs.items) |lib| {
1130 self.parseLibrary(lib, false) catch |err| switch (err) {1130 self.parseLibrary(lib, false) catch |err| switch (err) {
1131 error.MalformedObject, error.InvalidCpuArch => {}, // already reported1131 error.MalformedObject, error.MalformedArchive, error.InvalidCpuArch => {}, // already reported
1132 else => |e| try self.reportParseError(1132 else => |e| try self.reportParseError(
1133 lib.path,1133 lib.path,
1134 "unexpected error: parsing library failed with error {s}",1134 "unexpected error: parsing library failed with error {s}",
...@@ -1151,7 +1151,7 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node...@@ -1151,7 +1151,7 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node
11511151
1152 for (positionals.items) |obj| {1152 for (positionals.items) |obj| {
1153 self.parsePositional(obj.path, obj.must_link) catch |err| switch (err) {1153 self.parsePositional(obj.path, obj.must_link) catch |err| switch (err) {
1154 error.MalformedObject, error.InvalidCpuArch => {}, // already reported1154 error.MalformedObject, error.MalformedArchive, error.InvalidCpuArch => {}, // already reported
1155 else => |e| try self.reportParseError(1155 else => |e| try self.reportParseError(
1156 obj.path,1156 obj.path,
1157 "unexpected error: parsing input file failed with error {s}",1157 "unexpected error: parsing input file failed with error {s}",
...@@ -1316,7 +1316,7 @@ pub fn flushStaticLib(self: *Elf, comp: *Compilation, module_obj_path: ?[]const...@@ -1316,7 +1316,7 @@ pub fn flushStaticLib(self: *Elf, comp: *Compilation, module_obj_path: ?[]const
13161316
1317 for (positionals.items) |obj| {1317 for (positionals.items) |obj| {
1318 self.parsePositional(obj.path, obj.must_link) catch |err| switch (err) {1318 self.parsePositional(obj.path, obj.must_link) catch |err| switch (err) {
1319 error.MalformedObject, error.InvalidCpuArch => {}, // already reported1319 error.MalformedObject, error.MalformedArchive, error.InvalidCpuArch => {}, // already reported
1320 else => |e| try self.reportParseError(1320 else => |e| try self.reportParseError(
1321 obj.path,1321 obj.path,
1322 "unexpected error: parsing input file failed with error {s}",1322 "unexpected error: parsing input file failed with error {s}",
...@@ -1453,7 +1453,7 @@ pub fn flushObject(self: *Elf, comp: *Compilation, module_obj_path: ?[]const u8)...@@ -1453,7 +1453,7 @@ pub fn flushObject(self: *Elf, comp: *Compilation, module_obj_path: ?[]const u8)
14531453
1454 for (positionals.items) |obj| {1454 for (positionals.items) |obj| {
1455 self.parsePositional(obj.path, obj.must_link) catch |err| switch (err) {1455 self.parsePositional(obj.path, obj.must_link) catch |err| switch (err) {
1456 error.MalformedObject, error.InvalidCpuArch => {}, // already reported1456 error.MalformedObject, error.MalformedArchive, error.InvalidCpuArch => {}, // already reported
1457 else => |e| try self.reportParseError(1457 else => |e| try self.reportParseError(
1458 obj.path,1458 obj.path,
1459 "unexpected error: parsing input file failed with error {s}",1459 "unexpected error: parsing input file failed with error {s}",
...@@ -1959,7 +1959,7 @@ fn parseLdScript(self: *Elf, lib: SystemLib) ParseError!void {...@@ -1959,7 +1959,7 @@ fn parseLdScript(self: *Elf, lib: SystemLib) ParseError!void {
1959 .needed = scr_obj.needed,1959 .needed = scr_obj.needed,
1960 .path = full_path,1960 .path = full_path,
1961 }, false) catch |err| switch (err) {1961 }, false) catch |err| switch (err) {
1962 error.MalformedObject, error.InvalidCpuArch => {}, // already reported1962 error.MalformedObject, error.MalformedArchive, error.InvalidCpuArch => {}, // already reported
1963 else => |e| try self.reportParseError(1963 else => |e| try self.reportParseError(
1964 full_path,1964 full_path,
1965 "unexpected error: parsing library failed with error {s}",1965 "unexpected error: parsing library failed with error {s}",
src/link/Elf/Archive.zig+4-6
...@@ -33,12 +33,10 @@ pub fn parse(self: *Archive, elf_file: *Elf) !void {...@@ -33,12 +33,10 @@ pub fn parse(self: *Archive, elf_file: *Elf) !void {
33 const hdr = try reader.readStruct(elf.ar_hdr);33 const hdr = try reader.readStruct(elf.ar_hdr);
3434
35 if (!mem.eql(u8, &hdr.ar_fmag, elf.ARFMAG)) {35 if (!mem.eql(u8, &hdr.ar_fmag, elf.ARFMAG)) {
36 // TODO convert into an error36 try elf_file.reportParseError(self.path, "invalid archive header delimiter: {s}", .{
37 log.debug(37 std.fmt.fmtSliceEscapeLower(&hdr.ar_fmag),
38 "{s}: invalid header delimiter: expected '{s}', found '{s}'",38 });
39 .{ self.path, std.fmt.fmtSliceEscapeLower(elf.ARFMAG), std.fmt.fmtSliceEscapeLower(&hdr.ar_fmag) },39 return error.MalformedArchive;
40 );
41 return;
42 }40 }
4341
44 const size = try hdr.size();42 const size = try hdr.size();