Commit 947c87b558

Andrew Kelley <andrew@ziglang.org>
2019-04-04 07:34:13
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 parent e827b96
Changed files (1)
std
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;
         }