authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-12-05 13:53:11+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-12-05 13:53:11+01:00
log2e1dd1e554c9f557165520eba6199325b85c2d03
tree570fce3629faed5037688f459bfe8347f7f4a6ec
parent3f42ed3ca25d6ef32c92a8ed43129b789cf846c5

elf: move basic parse error reporting to SharedObject


1 files changed, 25 insertions(+), 0 deletions(-)

src/link/Elf/SharedObject.zig+25
......@@ -52,6 +52,27 @@ pub fn parse(self: *SharedObject, elf_file: *Elf) !void {
5252 const reader = stream.reader();
5353
5454 self.header = try reader.readStruct(elf.Elf64_Ehdr);
55
56 if (elf_file.base.options.target.cpu.arch != self.header.?.e_machine.toTargetCpuArch().?) {
57 try elf_file.reportParseError2(
58 self.index,
59 "invalid cpu architecture: {s}",
60 .{@tagName(self.header.?.e_machine.toTargetCpuArch().?)},
61 );
62 return error.InvalidCpuArch;
63 }
64
65 if (self.data.len < self.header.?.e_shoff or
66 self.data.len < self.header.?.e_shoff + self.header.?.e_shnum * @sizeOf(elf.Elf64_Shdr))
67 {
68 try elf_file.reportParseError2(
69 self.index,
70 "corrupted header: section header table extends past the end of file",
71 .{},
72 );
73 return error.LinkFail;
74 }
75
5576 const shoff = std.math.cast(usize, self.header.?.e_shoff) orelse return error.Overflow;
5677
5778 const shdrs = @as(
......@@ -61,6 +82,10 @@ pub fn parse(self: *SharedObject, elf_file: *Elf) !void {
6182 try self.shdrs.ensureTotalCapacityPrecise(gpa, shdrs.len);
6283
6384 for (shdrs, 0..) |shdr, i| {
85 if (self.data.len < shdr.sh_offset or self.data.len < shdr.sh_offset + shdr.sh_size) {
86 try elf_file.reportParseError2(self.index, "corrupted section header", .{});
87 return error.LinkFail;
88 }
6489 self.shdrs.appendAssumeCapacity(try ElfShdr.fromElf64Shdr(shdr));
6590 switch (shdr.sh_type) {
6691 elf.SHT_DYNSYM => self.dynsym_sect_index = @as(u16, @intCast(i)),