fix: exec-server stream was erroring for large requests #7654
+100
−73
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Previous to this change, large
EscalateRequestpayloads exceeded the kernel send buffer, causing our singlesendmsg(2)call (with attached FDs) to be split and retried without proper control handling; this led toEINVAL/broken pipe in thehandle_escalate_session_respects_run_in_sandbox_decision()test when using anenvwith large contents.Before:
AsyncSocket::send_with_fds()calledsend_json_message(), which calledsend_message_bytes(), which made onesocket.sendmsg()call followed by additionalsocket.send()calls, as necessary:codex/codex-rs/exec-server/src/posix/socket.rs
Lines 198 to 209 in 2e4a402
After:
AsyncSocket::send_with_fds()now callssend_stream_frame(), which callssend_stream_chunk()one or more times. Each call tosend_stream_chunk()callssocket.sendmsg().In the previous implementation, the subsequent
socket.send()writes had no control information associated with them, whereas in the newsend_stream_chunk()implementation, a freshMsgHdr(usingwith_control(), as appropriate) is created forsocket.sendmsg()each time.Additionally, with this PR, stream sending attaches
SCM_RIGHTSonly on the first chunk, and omits control data when there are no FDs, allowing oversized payloads to deliver correctly while preserving FD limits and error checks.