authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-03-03 09:15:40-05:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2020-03-03 09:15:40-05:00
log387418277a4964714ddaec3336a602ec87dde0f9
tree3983b22b7288ae7acefd117f8234c2bce8c74bd7
parentd7579a2fcb0edaa1f6036101d00316abccac0c7e
parent755941830555b7423903053742fcc21d49cd3923
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #4601 from alexnask/fix_3997

Allow wrapping in VDSO lookup

1 files changed, 7 insertions(+), 3 deletions(-)

lib/std/os/linux/vdso.zig+7-3
...@@ -22,7 +22,11 @@ pub fn lookup(vername: []const u8, name: []const u8) usize {...@@ -22,7 +22,11 @@ pub fn lookup(vername: []const u8, name: []const u8) usize {
22 }) {22 }) {
23 const this_ph = @intToPtr(*elf.Phdr, ph_addr);23 const this_ph = @intToPtr(*elf.Phdr, ph_addr);
24 switch (this_ph.p_type) {24 switch (this_ph.p_type) {
25 elf.PT_LOAD => base = vdso_addr + this_ph.p_offset - this_ph.p_vaddr,25 // On WSL1 as well as older kernels, the VDSO ELF image is pre-linked in the upper half
26 // of the memory space (e.g. p_vaddr = 0xffffffffff700000 on WSL1).
27 // Wrapping operations are used on this line as well as subsequent calculations relative to base
28 // (lines 47, 78) to ensure no overflow check is tripped.
29 elf.PT_LOAD => base = vdso_addr +% this_ph.p_offset -% this_ph.p_vaddr,
26 elf.PT_DYNAMIC => maybe_dynv = @intToPtr([*]usize, vdso_addr + this_ph.p_offset),30 elf.PT_DYNAMIC => maybe_dynv = @intToPtr([*]usize, vdso_addr + this_ph.p_offset),
27 else => {},31 else => {},
28 }32 }
...@@ -40,7 +44,7 @@ pub fn lookup(vername: []const u8, name: []const u8) usize {...@@ -40,7 +44,7 @@ pub fn lookup(vername: []const u8, name: []const u8) usize {
40 {44 {
41 var i: usize = 0;45 var i: usize = 0;
42 while (dynv[i] != 0) : (i += 2) {46 while (dynv[i] != 0) : (i += 2) {
43 const p = base + dynv[i + 1];47 const p = base +% dynv[i + 1];
44 switch (dynv[i]) {48 switch (dynv[i]) {
45 elf.DT_STRTAB => maybe_strings = @intToPtr([*]u8, p),49 elf.DT_STRTAB => maybe_strings = @intToPtr([*]u8, p),
46 elf.DT_SYMTAB => maybe_syms = @intToPtr([*]elf.Sym, p),50 elf.DT_SYMTAB => maybe_syms = @intToPtr([*]elf.Sym, p),
...@@ -71,7 +75,7 @@ pub fn lookup(vername: []const u8, name: []const u8) usize {...@@ -71,7 +75,7 @@ pub fn lookup(vername: []const u8, name: []const u8) usize {
71 if (!checkver(maybe_verdef.?, versym[i], vername, strings))75 if (!checkver(maybe_verdef.?, versym[i], vername, strings))
72 continue;76 continue;
73 }77 }
74 return base + syms[i].st_value;78 return base +% syms[i].st_value;
75 }79 }
7680
77 return 0;81 return 0;