authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-04-04 01:34:13-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-04-04 01:36:01-04:00
log947c87b558f860a3d87fe1aed6cc96f94fc00cb2
treeaaa098838a0f82018efdb1fe5339a20d751c9beb
parente827b9661b254bdc0e7300079dc1db4271d79638
signaturelock-open Commit is signed but in an unrecognized format.

threads: fix using unmapped memory in some cases

as pointed out in #musl IRC, the memory for the fs register address value needs to be taken into account in the mmap call.

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

std/os.zig+3-1
......@@ -3142,6 +3142,8 @@ pub fn spawnThread(context: var, comptime startFn: var) SpawnThreadError!*Thread
31423142 l = mem.alignForward(l, tls_phdr.p_align);
31433143 tls_start_offset = l;
31443144 l += tls_phdr.p_memsz;
3145 // the fs register address
3146 l += @sizeOf(usize);
31453147 }
31463148 }
31473149 break :blk l;
......@@ -3184,7 +3186,7 @@ pub fn spawnThread(context: var, comptime startFn: var) SpawnThreadError!*Thread
31843186 var newtls: usize = undefined;
31853187 if (linux_tls_phdr) |tls_phdr| {
31863188 @memcpy(@intToPtr([*]u8, mmap_addr + tls_start_offset), linux_tls_img_src, tls_phdr.p_filesz);
3187 newtls = mmap_addr + mmap_len;
3189 newtls = mmap_addr + mmap_len - @sizeOf(usize);
31883190 @intToPtr(*usize, newtls).* = newtls;
31893191 flags |= posix.CLONE_SETTLS;
31903192 }