codex - 💡(How to fix) Fix Repeat `Os { code: 24, kind: Uncategorized, message: "Too many open files" }` crashes [3 comments, 3 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
openai/codex#17806Fetched 2026-04-15 06:27:53
View on GitHub
Comments
3
Participants
3
Timeline
8
Reactions
0
Author
Timeline (top)
labeled ×4commented ×3unlabeled ×1

Error Message

Ensure that you've setup a tracing-error ErrorLayer and the semver versions are compatible Message: cwd root must be an absolute path: Too many open files (os error 24) Ensure that you've setup a tracing-error ErrorLayer and the semver versions are compatible HOWEVER, there are also paths where the codex CLI doesn't crash, and the error makes it to the model... If I explicitly tell codex to plan for this bug before we begin work, it usually allows us to gently pause work and relaunch, after it notifies me as such: We hit the file-descriptor bug again: a fresh local read just failed with Too many open files (os error 24), so I’m stopping here instead of pushing forward in a confused state.

Root Cause

Back in my C++ Windows days, a clever hack I came up with that I used to use a lot was declaring HANDLEs to the static analyzer as if they were pointers freed by CloseHandle and similar functions. It worked in part because of the C roots of Windows, where HANDLEs are just typedefd void* under the hood, and the MSVC static analyzer had reasonably good modeling of free and similar function semantics to detect memory bugs.

Code Example

The application panicked (crashed).
Message:  /tmp is absolute: Os { code: 24, kind: Uncategorized, message: "Too many open files" }
Location: protocol/src/permissions.rs:1057ee-worktree-specmaxxing · Context [██▏  ] · 5h 97% · weekly 49% · 950K window · 34.9M used · 34.8M in · 111K out · Fast on · Main [default]

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ BACKTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   1: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   2: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   3: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   4: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   5: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   6: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   7: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   8: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   9: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  10: __ZN4absl22internal_any_invocable19LocalManagerTrivialENS0_14FunctionToCallEPNS0_15TypeErasedStateES3_<unknown>
      at <unknown source file>:<unknown line>
  11: __ZN4absl22internal_any_invocable19LocalManagerTrivialENS0_14FunctionToCallEPNS0_15TypeErasedStateES3_<unknown>
      at <unknown source file>:<unknown line>
  12: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  13: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  14: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  15: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  16: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  17: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  18: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  19: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  20: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  21: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  22: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  23: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  24: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  25: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  26: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  27: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  28: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  29: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  30: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  31: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  32: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  33: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  34: __pthread_cond_wait<unknown>
      at <unknown source file>:<unknown line>

Run with COLORBT_SHOW_HIDDEN=1 environment variable to disable frame filtering.
Run with RUST_BACKTRACE=full to include source snippets.
Warning: SpanTrace capture is Unsupported.
Ensure that you've setup a tracing-error ErrorLayer and the semver versions are compatible
The application panicked (crashed).
Message:  cwd root must be an absolute path: Too many open files (os error 24)
Location: protocol/src/permissions.rs:1021

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ BACKTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   1: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   2: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   3: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   4: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   5: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   6: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   7: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   8: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   9: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  10: __ZN4absl22internal_any_invocable19LocalManagerTrivialENS0_14FunctionToCallEPNS0_15TypeErasedStateES3_<unknown>
      at <unknown source file>:<unknown line>
  11: __ZN4absl22internal_any_invocable19LocalManagerTrivialENS0_14FunctionToCallEPNS0_15TypeErasedStateES3_<unknown>
      at <unknown source file>:<unknown line>
  12: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  13: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  14: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  15: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  16: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  17: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  18: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  19: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  20: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  21: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  22: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  23: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  24: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  25: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  26: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  27: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  28: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  29: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  30: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  31: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  32: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  33: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  34: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  35: __pthread_cond_wait<unknown>
      at <unknown source file>:<unknown line>

Run with COLORBT_SHOW_HIDDEN=1 environment variable to disable frame filtering.
Run with RUST_BACKTRACE=full to include source snippets.
Warning: SpanTrace capture is Unsupported.
Ensure that you've setup a tracing-error ErrorLayer and the semver versions are compatible
^C^X^C^Czsh: terminated  codex resume
Exit status: 143

---

We hit the file-descriptor bug again: a fresh local read just failed with Too many open files (os error 24), so I’m stopping here instead of pushing forward in a confused state.
RAW_BUFFERClick to expand / collapse

What version of Codex CLI is running?

v0.120.0

What subscription do you have?

Pro

Which model were you using?

gpt-5.4 xhigh

What platform is your computer?

Darwin 25.4.0 arm64 arm

What terminal emulator and version are you using (if applicable)?

Ghostty 1.3.1

What issue are you seeing?

This has been going on for a month-ish or more, despite several updates to codex that I'd hoped would resolve it without needing to file an issue of my own.

The crashes are almost always in https://github.com/openai/codex/blob/b3ae531b3a6c4f9742dff6a7bd1b14796bde9c53/codex-rs/protocol/src/permissions.rs#L1020

and/or https://github.com/openai/codex/blob/b3ae531b3a6c4f9742dff6a7bd1b14796bde9c53/codex-rs/protocol/src/permissions.rs#L1057

The rust panic! looks like this with RUST_BACKTRACE=1:


› The application panicked (crashed).
Message:  /tmp is absolute: Os { code: 24, kind: Uncategorized, message: "Too many open files" }
Location: protocol/src/permissions.rs:1057ee-worktree-specmaxxing · Context [██▏  ] · 5h 97% · weekly 49% · 950K window · 34.9M used · 34.8M in · 111K out · Fast on · Main [default]

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ BACKTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   1: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   2: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   3: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   4: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   5: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   6: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   7: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   8: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   9: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  10: __ZN4absl22internal_any_invocable19LocalManagerTrivialENS0_14FunctionToCallEPNS0_15TypeErasedStateES3_<unknown>
      at <unknown source file>:<unknown line>
  11: __ZN4absl22internal_any_invocable19LocalManagerTrivialENS0_14FunctionToCallEPNS0_15TypeErasedStateES3_<unknown>
      at <unknown source file>:<unknown line>
  12: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  13: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  14: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  15: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  16: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  17: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  18: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  19: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  20: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  21: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  22: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  23: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  24: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  25: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  26: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  27: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  28: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  29: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  30: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  31: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  32: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  33: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  34: __pthread_cond_wait<unknown>
      at <unknown source file>:<unknown line>

Run with COLORBT_SHOW_HIDDEN=1 environment variable to disable frame filtering.
Run with RUST_BACKTRACE=full to include source snippets.
Warning: SpanTrace capture is Unsupported.
Ensure that you've setup a tracing-error ErrorLayer and the semver versions are compatible
The application panicked (crashed).
Message:  cwd root must be an absolute path: Too many open files (os error 24)
Location: protocol/src/permissions.rs:1021

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ BACKTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   1: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   2: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   3: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   4: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   5: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   6: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   7: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   8: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
   9: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  10: __ZN4absl22internal_any_invocable19LocalManagerTrivialENS0_14FunctionToCallEPNS0_15TypeErasedStateES3_<unknown>
      at <unknown source file>:<unknown line>
  11: __ZN4absl22internal_any_invocable19LocalManagerTrivialENS0_14FunctionToCallEPNS0_15TypeErasedStateES3_<unknown>
      at <unknown source file>:<unknown line>
  12: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  13: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  14: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  15: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  16: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  17: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  18: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  19: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  20: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  21: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  22: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  23: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  24: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  25: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  26: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  27: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  28: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  29: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  30: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  31: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  32: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  33: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  34: __mh_execute_header<unknown>
      at <unknown source file>:<unknown line>
  35: __pthread_cond_wait<unknown>
      at <unknown source file>:<unknown line>

Run with COLORBT_SHOW_HIDDEN=1 environment variable to disable frame filtering.
Run with RUST_BACKTRACE=full to include source snippets.
Warning: SpanTrace capture is Unsupported.
Ensure that you've setup a tracing-error ErrorLayer and the semver versions are compatible
^C^X^C^Czsh: terminated  codex resume
Exit status: 143

Not super useful of course, as is what I'd expect with a native crash. If necessary, I can probably use lldb to actually get something useful.

When we hit the crash, the TUI gets fully corrupted, and I have to quit the binary from activity monitor.

HOWEVER, there are also paths where the codex CLI doesn't crash, and the error makes it to the model... If I explicitly tell codex to plan for this bug before we begin work, it usually allows us to gently pause work and relaunch, after it notifies me as such:

We hit the file-descriptor bug again: a fresh local read just failed with Too many open files (os error 24), so I’m stopping here instead of pushing forward in a confused state.

It sometimes seems like the crash condition only happens when subagents are running, but I'm not quite sure.

What steps can reproduce the bug?

Uploaded thread: 019d8b31-ed1e-7a33-8511-d5536fddc1e8

Otherwise I'm not really sure, if this was a reasonable bug I'd assume most other people would be hitting it in daily use with moderately long running sessions

What is the expected behavior?

Not.... leaking file descriptors?

Additional information

Surely there's a way in rust to somehow enforce file handle usage and freeing at compile time?

Back in my C++ Windows days, a clever hack I came up with that I used to use a lot was declaring HANDLEs to the static analyzer as if they were pointers freed by CloseHandle and similar functions. It worked in part because of the C roots of Windows, where HANDLEs are just typedefd void* under the hood, and the MSVC static analyzer had reasonably good modeling of free and similar function semantics to detect memory bugs.

extent analysis

TL;DR

The issue is likely due to a file descriptor leak, causing the "Too many open files" error, and can be mitigated by identifying and closing unused file handles.

Guidance

  • Review the code in permissions.rs around lines 1020 and 1057 to identify potential file handle leaks.
  • Use tools like lsof or strace to monitor file descriptor usage and identify which files are being left open.
  • Consider using Rust's drop function or implementing a custom Drop trait to ensure file handles are closed when no longer needed.
  • If the issue is related to subagents, investigate how file handles are being managed across different threads or processes.

Example

No specific code example can be provided without more context, but ensuring that file handles are properly closed can be achieved using Rust's std::fs::File and std::io modules, for example:

use std::fs::File;
use std::io;

let file = File::open("example.txt").unwrap();
// Use the file
drop(file); // Ensure the file is closed

Notes

The provided backtrace is not very informative due to the lack of symbol information, making it difficult to pinpoint the exact cause of the issue. Using RUST_BACKTRACE=full and COLORBT_SHOW_HIDDEN=1 environment variables may provide more detailed information.

Recommendation

Apply a workaround by identifying and closing unused file handles, as upgrading to a fixed version is not mentioned in the issue. This approach can help mitigate the "Too many open files" error and prevent crashes.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING