fix(spawn): leak child thread fd to prevent race with dynamic linker

posix_spawn creates a new context and returns its thread fd to the
parent. The kernel currently does not keep a self-reference to the child
context's thread fd, so when the parent closes its handle, the child's
thread object may be destroyed before the dynamic linker reads
AT_REDOX_THR_FD from auxv and opens regs/env. Leak the parent handle
until the kernel is fixed to retain a reference per context.
This commit is contained in:
Red Bear OS
2026-07-14 16:37:24 +09:00
parent 7dee54808a
commit 7a8c7564ba
+7
View File
@@ -1483,6 +1483,13 @@ impl Pal for Sys {
let start_fd = child.thr_fd.dup_into_upper(b"start")?;
start_fd.write(&[0])?;
// The kernel does not keep a self-reference to the new context's thread
// fd. If the parent closes its handle before the child reads AT_REDOX_THR_FD
// from auxv and creates its own reference, the child thread object is
// destroyed and the dynamic linker panics trying to open regs/env. Until
// the kernel holds a reference per context, leak the parent handle.
let _ = child.thr_fd.take();
Ok(pid_t::try_from(child.pid).unwrap())
}