diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2019-04-04 01:34:13 -0400 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2019-04-04 01:36:01 -0400 |
| commit | 947c87b558f860a3d87fe1aed6cc96f94fc00cb2 (patch) | |
| tree | aaa098838a0f82018efdb1fe5339a20d751c9beb /std/os.zig | |
| parent | e827b9661b254bdc0e7300079dc1db4271d79638 (diff) | |
| download | zig-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.zig | 4 |
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; } |
