aboutsummaryrefslogtreecommitdiff
path: root/src/link/Elf/Object.zig
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2023-12-05 13:28:47 +0100
committerJakub Konka <kubkon@jakubkonka.com>2023-12-05 13:28:47 +0100
commitaf8621db2d2de4675240dad0ff885f23dc33f518 (patch)
tree6d3085ccc8bd161aacfd2d5d1b3c9f9a771ea33d /src/link/Elf/Object.zig
parent72568c131dcfc9303de0a809e02290c7ac464663 (diff)
downloadzig-af8621db2d2de4675240dad0ff885f23dc33f518.tar.gz
zig-af8621db2d2de4675240dad0ff885f23dc33f518.zip
elf: report error at the point where it is happening
Diffstat (limited to 'src/link/Elf/Object.zig')
-rw-r--r--src/link/Elf/Object.zig15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/link/Elf/Object.zig b/src/link/Elf/Object.zig
index 2bcc56b038..4f390f31fa 100644
--- a/src/link/Elf/Object.zig
+++ b/src/link/Elf/Object.zig
@@ -58,6 +58,17 @@ pub fn parse(self: *Object, elf_file: *Elf) !void {
const gpa = elf_file.base.allocator;
+ if (self.data.len < self.header.?.e_shoff or
+ self.data.len < self.header.?.e_shoff + self.header.?.e_shnum * @sizeOf(elf.Elf64_Shdr))
+ {
+ try elf_file.reportParseError2(
+ self.index,
+ "corrupted header: section header table extends past the end of file",
+ .{},
+ );
+ return error.LinkFail;
+ }
+
const shoff = math.cast(usize, self.header.?.e_shoff) orelse return error.Overflow;
const shdrs = @as(
[*]align(1) const elf.Elf64_Shdr,
@@ -66,6 +77,10 @@ pub fn parse(self: *Object, elf_file: *Elf) !void {
try self.shdrs.ensureTotalCapacityPrecise(gpa, shdrs.len);
for (shdrs) |shdr| {
+ if (self.data.len < shdr.sh_offset or self.data.len < shdr.sh_offset + shdr.sh_size) {
+ try elf_file.reportParseError2(self.index, "corrupted section header", .{});
+ return error.LinkFail;
+ }
self.shdrs.appendAssumeCapacity(try ElfShdr.fromElf64Shdr(shdr));
}