Skip to content

fix: preserve zsh-fork escalation fds across unified-exec spawn paths#13644

Merged
bolinfest merged 1 commit intomainfrom
pr13644
Mar 13, 2026
Merged

fix: preserve zsh-fork escalation fds across unified-exec spawn paths#13644
bolinfest merged 1 commit intomainfrom
pr13644

Conversation

@bolinfest
Copy link
Collaborator

@bolinfest bolinfest commented Mar 6, 2026

Why

zsh-fork sessions launched through unified-exec need the escalation socket to survive the wrapper -> server -> child handoff so later intercepted exec() calls can still reach the escalation server.

The inherited-fd spawn path also needs to avoid closing Rust's internal exec-error pipe, and the shell-escalation handoff needs to tolerate the receive-side case where a transferred fd is installed into the same stdio slot it will be mapped onto.

What Changed

  • Added SpawnLifecycle::inherited_fds() in codex-rs/core/src/unified_exec/process.rs and threaded inherited fds through codex-rs/core/src/unified_exec/process_manager.rs so unified-exec can preserve required descriptors across both PTY and no-stdin pipe spawn paths.
  • Updated codex-rs/core/src/tools/runtimes/shell/zsh_fork_backend.rs to expose the escalation socket fd through the spawn lifecycle.
  • Added inherited-fd-aware spawn helpers in codex-rs/utils/pty/src/pty.rs and codex-rs/utils/pty/src/pipe.rs, including Unix pre-exec fd pruning that preserves requested inherited fds while leaving FD_CLOEXEC descriptors alone. The pruning helper is now named close_inherited_fds_except() to better describe that behavior.
  • Updated codex-rs/shell-escalation/src/unix/escalate_client.rs to duplicate local stdio before transfer and send destination stdio numbers in SuperExecMessage, so the wrapper keeps using its own stdin/stdout/stderr until the escalated child takes over.
  • Updated codex-rs/shell-escalation/src/unix/escalate_server.rs so the server accepts the overlap case where a received fd reuses the same stdio descriptor number that the child setup will target with dup2.
  • Added comments around the PTY stdio wiring and the overlap regression helper to make the fd handoff and controlling-terminal setup easier to follow.

Verification

  • cargo test -p codex-utils-pty
    • covers preserved-fd PTY spawn behavior, PTY resize, Python REPL continuity, exec-failure reporting, and the no-stdin pipe path
  • cargo test -p codex-shell-escalation
    • covers duplicated-fd transfer on the client side and verifies the overlap case by passing a pipe-backed stdin payload through the server-side dup2 path

Stack created with Sapling. Best reviewed with ReviewStack.

Copy link
Contributor

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2b012624ce

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Copy link
Collaborator

@jif-oai jif-oai left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will require some heavy testing in the end but I guess it's in the follow up

Approving to unblock but please make sure the point raised (mainly for non-pty) are not real issues

@bolinfest bolinfest force-pushed the pr13644 branch 8 times, most recently from 1b7e3ec to b23aeee Compare March 13, 2026 16:43
@bolinfest bolinfest changed the title fix: preserve zsh-fork escalation fds in unified-exec PTYs fix: preserve zsh-fork escalation fds across unified-exec spawn paths Mar 13, 2026
@bolinfest bolinfest force-pushed the pr13644 branch 5 times, most recently from 456e627 to 84ec355 Compare March 13, 2026 19:56
@bolinfest bolinfest merged commit ef37d31 into main Mar 13, 2026
60 checks passed
@bolinfest bolinfest deleted the pr13644 branch March 13, 2026 20:25
@github-actions github-actions bot locked and limited conversation to collaborators Mar 13, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants