aboutsummaryrefslogtreecommitdiff
path: root/std/os.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2019-04-04 01:34:13 -0400
committerAndrew Kelley <andrew@ziglang.org>2019-04-04 01:36:01 -0400
commit947c87b558f860a3d87fe1aed6cc96f94fc00cb2 (patch)
treeaaa098838a0f82018efdb1fe5339a20d751c9beb /std/os.zig
parente827b9661b254bdc0e7300079dc1db4271d79638 (diff)
downloadzig-947c87b558f860a3d87fe1aed6cc96f94fc00cb2.tar.gz
zig-947c87b558f860a3d87fe1aed6cc96f94fc00cb2.zip
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.
Diffstat (limited to 'std/os.zig')
-rw-r--r--std/os.zig4
1 files changed, 3 insertions, 1 deletions
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;
}