aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2023-09-13 22:38:44 +0200
committerJakub Konka <kubkon@jakubkonka.com>2023-09-13 22:38:44 +0200
commitfc86b80b3b9610a10f05ca55775c61a8e4571b17 (patch)
tree7b66192257d48b87b78c99033c59dbe606449c68 /src
parentd4c1e85a13ba83a7a36245bd988adbc4cf894f9c (diff)
downloadzig-fc86b80b3b9610a10f05ca55775c61a8e4571b17.tar.gz
zig-fc86b80b3b9610a10f05ca55775c61a8e4571b17.zip
elf: correctly handle overflows on non-64bit hosts
Diffstat (limited to 'src')
-rw-r--r--src/arch/x86_64/Disassembler.zig5
-rw-r--r--src/link/Elf/Atom.zig9
2 files changed, 8 insertions, 6 deletions
diff --git a/src/arch/x86_64/Disassembler.zig b/src/arch/x86_64/Disassembler.zig
index 4fdddcd629..a0d5dea29c 100644
--- a/src/arch/x86_64/Disassembler.zig
+++ b/src/arch/x86_64/Disassembler.zig
@@ -19,6 +19,7 @@ pub const Error = error{
EndOfStream,
LegacyPrefixAfterRex,
UnknownOpcode,
+ Overflow,
Todo,
};
@@ -368,7 +369,7 @@ fn parseImm(dis: *Disassembler, kind: Encoding.Op) !Immediate {
.imm64 => Immediate.u(try reader.readInt(u64, .Little)),
else => unreachable,
};
- dis.pos += creader.bytes_read;
+ dis.pos += std.math.cast(usize, creader.bytes_read) orelse return error.Overflow;
return imm;
}
@@ -469,6 +470,6 @@ fn parseDisplacement(dis: *Disassembler, modrm: ModRm, sib: ?Sib) !i32 {
0b11 => unreachable,
};
};
- dis.pos += creader.bytes_read;
+ dis.pos += std.math.cast(usize, creader.bytes_read) orelse return error.Overflow;
return disp;
}
diff --git a/src/link/Elf/Atom.zig b/src/link/Elf/Atom.zig
index 43a8913c4b..073536fbaa 100644
--- a/src/link/Elf/Atom.zig
+++ b/src/link/Elf/Atom.zig
@@ -425,6 +425,7 @@ pub fn resolveRelocs(self: Atom, elf_file: *Elf, code: []u8) !void {
.object => |x| elf_file.symbol(x.symbols.items[rel.r_sym()]),
else => unreachable,
};
+ const r_offset = std.math.cast(usize, rel.r_offset) orelse return error.Overflow;
// We will use equation format to resolve relocations:
// https://intezer.com/blog/malware-analysis/executable-and-linkable-format-101-part-3-relocations/
@@ -454,14 +455,14 @@ pub fn resolveRelocs(self: Atom, elf_file: *Elf, code: []u8) !void {
relocs_log.debug(" {s}: {x}: [{x} => {x}] G({x}) ({s})", .{
fmtRelocType(r_type),
- rel.r_offset,
+ r_offset,
P,
S + A,
G + GOT + A,
target.name(elf_file),
});
- try stream.seekTo(rel.r_offset);
+ try stream.seekTo(r_offset);
switch (rel.r_type()) {
elf.R_X86_64_NONE => unreachable,
@@ -481,7 +482,7 @@ pub fn resolveRelocs(self: Atom, elf_file: *Elf, code: []u8) !void {
elf.R_X86_64_GOTPCRELX => {
if (!target.flags.import and !target.isIFunc(elf_file) and !target.isAbs(elf_file)) blk: {
- x86_64.relaxGotpcrelx(code[rel.r_offset - 2 ..]) catch break :blk;
+ x86_64.relaxGotpcrelx(code[r_offset - 2 ..]) catch break :blk;
try cwriter.writeIntLittle(i32, @as(i32, @intCast(S + A - P)));
continue;
}
@@ -490,7 +491,7 @@ pub fn resolveRelocs(self: Atom, elf_file: *Elf, code: []u8) !void {
elf.R_X86_64_REX_GOTPCRELX => {
if (!target.flags.import and !target.isIFunc(elf_file) and !target.isAbs(elf_file)) blk: {
- x86_64.relaxRexGotpcrelx(code[rel.r_offset - 3 ..]) catch break :blk;
+ x86_64.relaxRexGotpcrelx(code[r_offset - 3 ..]) catch break :blk;
try cwriter.writeIntLittle(i32, @as(i32, @intCast(S + A - P)));
continue;
}