| ... | @@ -1147,6 +1147,11 @@ const LinuxThreadImpl = struct { | ... | @@ -1147,6 +1147,11 @@ const LinuxThreadImpl = struct { |
| 1147 | /// Ported over from musl libc's pthread detached implementation: | 1147 | /// Ported over from musl libc's pthread detached implementation: |
| 1148 | /// https://github.com/ifduyue/musl/search?q=__unmapself | 1148 | /// https://github.com/ifduyue/musl/search?q=__unmapself |
| 1149 | fn freeAndExit(self: *ThreadCompletion) noreturn { | 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 | // If a signal were delivered between SYS_munmap and SYS_exit, any installed signal | 1155 | // If a signal were delivered between SYS_munmap and SYS_exit, any installed signal |
| 1151 | // handler would immediately segfault due to the stack being unmapped. To avoid this, | 1156 | // handler would immediately segfault due to the stack being unmapped. To avoid this, |
| 1152 | // we need to mask all signals before entering the inline asm. | 1157 | // we need to mask all signals before entering the inline asm. |