@zigc/lib 0.16.0-dev.3061 → 0.16.0-dev.3066

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zigc/lib",
3
- "version": "0.16.0-dev.3061",
3
+ "version": "0.16.0-dev.3066",
4
4
  "description": "Zig standard library and libc headers (shared across all platforms)",
5
5
  "repository": {
6
6
  "type": "git",
package/std/Thread.zig CHANGED
@@ -1147,6 +1147,11 @@ const LinuxThreadImpl = struct {
1147
1147
  /// Ported over from musl libc's pthread detached implementation:
1148
1148
  /// https://github.com/ifduyue/musl/search?q=__unmapself
1149
1149
  fn freeAndExit(self: *ThreadCompletion) noreturn {
1150
+ // If we do not reset the child_tidptr to null here, the kernel would later write the
1151
+ // value zero to that address, which is inside the block we're unmapping below, after
1152
+ // our thread exits. This can sometimes corrupt memory in other mmap blocks from
1153
+ // unrelated concurrent threads.
1154
+ _ = linux.set_tid_address(null);
1150
1155
  // If a signal were delivered between SYS_munmap and SYS_exit, any installed signal
1151
1156
  // handler would immediately segfault due to the stack being unmapped. To avoid this,
1152
1157
  // we need to mask all signals before entering the inline asm.
@@ -1484,7 +1489,7 @@ const LinuxThreadImpl = struct {
1484
1489
  }
1485
1490
 
1486
1491
  // Prepare the TLS segment and prepare a user_desc struct when needed on x86
1487
- var tls_ptr = linux.tls.prepareArea(mapped[tls_offset..]);
1492
+ var tls_ptr = linux.tls.prepareArea(mapped[tls_offset..][0..linux.tls.area_desc.size]);
1488
1493
  var user_desc: if (target.cpu.arch == .x86) linux.user_desc else void = undefined;
1489
1494
  if (target.cpu.arch == .x86) {
1490
1495
  defer tls_ptr = @intFromPtr(&user_desc);
package/std/os/linux.zig CHANGED
@@ -1584,6 +1584,11 @@ pub fn clone2(flags: u32, child_stack_ptr: usize) usize {
1584
1584
  return syscall2(.clone, flags, child_stack_ptr);
1585
1585
  }
1586
1586
 
1587
+ /// This call cannot fail, and the return value is the caller's thread id
1588
+ pub fn set_tid_address(tidptr: ?*pid_t) pid_t {
1589
+ return @intCast(@as(u32, @truncate(syscall1(.set_tid_address, @intFromPtr(tidptr)))));
1590
+ }
1591
+
1587
1592
  pub fn close(fd: fd_t) usize {
1588
1593
  return syscall1(.close, @as(usize, @bitCast(@as(isize, fd))));
1589
1594
  }