authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-09-13 22:38:44+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-09-13 22:38:44+02:00
logfc86b80b3b9610a10f05ca55775c61a8e4571b17
tree7b66192257d48b87b78c99033c59dbe606449c68
parentd4c1e85a13ba83a7a36245bd988adbc4cf894f9c

elf: correctly handle overflows on non-64bit hosts


2 files changed, 8 insertions(+), 6 deletions(-)

src/arch/x86_64/Disassembler.zig+3-2
......@@ -19,6 +19,7 @@ pub const Error = error{
1919 EndOfStream,
2020 LegacyPrefixAfterRex,
2121 UnknownOpcode,
22 Overflow,
2223 Todo,
2324};
2425
......@@ -368,7 +369,7 @@ fn parseImm(dis: *Disassembler, kind: Encoding.Op) !Immediate {
368369 .imm64 => Immediate.u(try reader.readInt(u64, .Little)),
369370 else => unreachable,
370371 };
371 dis.pos += creader.bytes_read;
372 dis.pos += std.math.cast(usize, creader.bytes_read) orelse return error.Overflow;
372373 return imm;
373374}
374375
......@@ -469,6 +470,6 @@ fn parseDisplacement(dis: *Disassembler, modrm: ModRm, sib: ?Sib) !i32 {
469470 0b11 => unreachable,
470471 };
471472 };
472 dis.pos += creader.bytes_read;
473 dis.pos += std.math.cast(usize, creader.bytes_read) orelse return error.Overflow;
473474 return disp;
474475}
src/link/Elf/Atom.zig+5-4
......@@ -425,6 +425,7 @@ pub fn resolveRelocs(self: Atom, elf_file: *Elf, code: []u8) !void {
425425 .object => |x| elf_file.symbol(x.symbols.items[rel.r_sym()]),
426426 else => unreachable,
427427 };
428 const r_offset = std.math.cast(usize, rel.r_offset) orelse return error.Overflow;
428429
429430 // We will use equation format to resolve relocations:
430431 // 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 {
454455
455456 relocs_log.debug(" {s}: {x}: [{x} => {x}] G({x}) ({s})", .{
456457 fmtRelocType(r_type),
457 rel.r_offset,
458 r_offset,
458459 P,
459460 S + A,
460461 G + GOT + A,
461462 target.name(elf_file),
462463 });
463464
464 try stream.seekTo(rel.r_offset);
465 try stream.seekTo(r_offset);
465466
466467 switch (rel.r_type()) {
467468 elf.R_X86_64_NONE => unreachable,
......@@ -481,7 +482,7 @@ pub fn resolveRelocs(self: Atom, elf_file: *Elf, code: []u8) !void {
481482
482483 elf.R_X86_64_GOTPCRELX => {
483484 if (!target.flags.import and !target.isIFunc(elf_file) and !target.isAbs(elf_file)) blk: {
484 x86_64.relaxGotpcrelx(code[rel.r_offset - 2 ..]) catch break :blk;
485 x86_64.relaxGotpcrelx(code[r_offset - 2 ..]) catch break :blk;
485486 try cwriter.writeIntLittle(i32, @as(i32, @intCast(S + A - P)));
486487 continue;
487488 }
......@@ -490,7 +491,7 @@ pub fn resolveRelocs(self: Atom, elf_file: *Elf, code: []u8) !void {
490491
491492 elf.R_X86_64_REX_GOTPCRELX => {
492493 if (!target.flags.import and !target.isIFunc(elf_file) and !target.isAbs(elf_file)) blk: {
493 x86_64.relaxRexGotpcrelx(code[rel.r_offset - 3 ..]) catch break :blk;
494 x86_64.relaxRexGotpcrelx(code[r_offset - 3 ..]) catch break :blk;
494495 try cwriter.writeIntLittle(i32, @as(i32, @intCast(S + A - P)));
495496 continue;
496497 }