mirror of
https://github.com/openai/codex.git
synced 2026-11-01 19:33:35 +00:00
## Why Pipe spawning installs Unix `pre_exec` hooks, forcing a fork on macOS even though the shared child launcher supports native spawning. ## What changed - Use the shared `Command` for pipe processes, enabling native macOS spawning while preserving session isolation, explicit descriptor inheritance, and Linux parent-death handling. - Select `ReapOnly` so the pipe adapter retains ownership of process-tree termination. - Track embedded NUL bytes in original Unix command inputs and reject them before spawning, including when invalid `current_dir` or `arg0` values are later replaced. ## Testing Add macOS integration coverage verifying fork avoidance, executable path lookup, pipe I/O, session isolation, and descriptor inheritance. Add Unix regression tests for pipe and PTY fallback under descriptor pressure and for rejecting NUL inputs without running the child. GitOrigin-RevId: f4fa2c1d3c1aee2c4ffa1dc2ff946f9f0b08eb20
21 lines
551 B
Rust
21 lines
551 B
Rust
use super::*;
|
|
use std::process::Stdio;
|
|
|
|
#[test]
|
|
fn process_fallback_interrupt_terminates_root() -> anyhow::Result<()> {
|
|
let mut child = std::process::Command::new("ping.exe")
|
|
.args(["-n", "60", "127.0.0.1"])
|
|
.stdin(Stdio::null())
|
|
.stdout(Stdio::null())
|
|
.stderr(Stdio::null())
|
|
.spawn()?;
|
|
let mut terminator = PipeChildTerminator {
|
|
windows: WindowsChildTerminator::Process(child.id()),
|
|
};
|
|
|
|
terminator.signal(ProcessSignal::Interrupt)?;
|
|
|
|
assert!(!child.wait()?.success());
|
|
Ok(())
|
|
}
|