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...@@ -3142,6 +3142,8 @@ pub fn spawnThread(context: var, comptime startFn: var) SpawnThreadError!*Thread
3142 l = mem.alignForward(l, tls_phdr.p_align);3142 l = mem.alignForward(l, tls_phdr.p_align);
3143 tls_start_offset = l;3143 tls_start_offset = l;
3144 l += tls_phdr.p_memsz;3144 l += tls_phdr.p_memsz;
3145 // the fs register address
3146 l += @sizeOf(usize);
3145 }3147 }
3146 }3148 }
3147 break :blk l;3149 break :blk l;
...@@ -3184,7 +3186,7 @@ pub fn spawnThread(context: var, comptime startFn: var) SpawnThreadError!*Thread...@@ -3184,7 +3186,7 @@ pub fn spawnThread(context: var, comptime startFn: var) SpawnThreadError!*Thread
3184 var newtls: usize = undefined;3186 var newtls: usize = undefined;
3185 if (linux_tls_phdr) |tls_phdr| {3187 if (linux_tls_phdr) |tls_phdr| {
3186 @memcpy(@intToPtr([*]u8, mmap_addr + tls_start_offset), linux_tls_img_src, tls_phdr.p_filesz);3188 @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);
3188 @intToPtr(*usize, newtls).* = newtls;3190 @intToPtr(*usize, newtls).* = newtls;
3189 flags |= posix.CLONE_SETTLS;3191 flags |= posix.CLONE_SETTLS;
3190 }3192 }