From 947c87b558f860a3d87fe1aed6cc96f94fc00cb2 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 4 Apr 2019 01:34:13 -0400 Subject: 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. --- std/os.zig | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'std/os.zig') diff --git a/std/os.zig b/std/os.zig index 1416f3d49e..b89b2a9ce2 100644 --- a/std/os.zig +++ b/std/os.zig @@ -3142,6 +3142,8 @@ pub fn spawnThread(context: var, comptime startFn: var) SpawnThreadError!*Thread l = mem.alignForward(l, tls_phdr.p_align); tls_start_offset = l; l += tls_phdr.p_memsz; + // the fs register address + l += @sizeOf(usize); } } break :blk l; @@ -3184,7 +3186,7 @@ pub fn spawnThread(context: var, comptime startFn: var) SpawnThreadError!*Thread var newtls: usize = undefined; if (linux_tls_phdr) |tls_phdr| { @memcpy(@intToPtr([*]u8, mmap_addr + tls_start_offset), linux_tls_img_src, tls_phdr.p_filesz); - newtls = mmap_addr + mmap_len; + newtls = mmap_addr + mmap_len - @sizeOf(usize); @intToPtr(*usize, newtls).* = newtls; flags |= posix.CLONE_SETTLS; } -- cgit v1.2.3