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.
This commit is contained in:
Andrew Kelley 2019-04-04 01:34:13 -04:00
parent e827b9661b
commit 947c87b558
No known key found for this signature in database
GPG Key ID: 7C5F548F728501A9

View File

@ -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;
}