Skip to content

[Linux][26.924] SIGCHLD handler overwritten during startup; preserving libuv handler restores thread loading #48618

Closed

Description

@smturtle2

Environment

  • ChatGPT Desktop: 26.924.22138-1
  • Build: 11645, commit 2e782921399a788a842b74ee1944a2e1e6e003a1
  • Bundled app-server: 0.158.0-alpha.2.1
  • OS: CachyOS, x86_64
  • Kernel: 7.2.8-1-cachyos
  • Desktop: KDE Wayland; application running through XWayland

Related reports: #48419, #48413, #48397. This report adds process-level tracing and a controlled diagnostic intervention. A shared root cause across those reports has not been independently verified.

Symptoms

After updating to 26.924.x, existing local conversations remain loading. Reinstalling 26.924.22138-1 does not resolve it.

The local app-server initializes successfully and answers thread/read, but conversation loading does not complete.

Additional symptoms:

Failed to load shell env ... Timed out after 5000ms.
Git is unavailable

The desktop process retains terminated zsh, git, ps, and gh children as zombies. Inspected zsh and git children exited successfully with status 0.

Startup tracing

Tracing rt_sigaction, wait4, waitid, and SIGCHLD showed this sequence in the desktop main process:

12:49:56.548989  SIGCHLD handler registered: libuv handler, SA_RESTART
12:49:56.611927  SIGCHLD handler replaced: no-op handler, flags=0
12:50:00.037904  SIGCHLD delivered: child exited with status 0

Disassembly of the replacement handler showed that it returns without doing work.

The registration pattern matches the no-op handler installed by ChromeBrowserMainPartsPosix::PreEarlyInitialization. The precise caller identification is inferred from the disassembly and upstream source; full application debug symbols were unavailable.

Controlled comparison

A baseline run under GDB reproduced the failure.

In a second run, GDB intercepted only the identified no-op SIGCHLD registration and changed its act argument to NULL, preserving the previously installed handler. Installed application files were not modified.

Both runs used the same application version, user profile, configuration, and existing conversation.

Check Baseline No-op replacement suppressed
Shell environment initialization 5000 ms timeout No timeout recorded
Terminated child processes Remain zombies No zombies observed
Git operations Reported unavailable Commands complete
Existing conversation Loading never completes Content visible in 1512 ms

Successful-run log excerpts, with identifiers omitted:

method=thread/resume durationMs=467 errorCode=null
maybe_resume_success
name=thread_navigation outcome=success
marksMs={"hydration_started":444.3,"history_ready":1246.8,
         "hydration_finished":1287.4,"content_visible":1512}

Additional checks

  • Reproduced with Qt excluded and GTK used instead.
  • Both local SQLite databases passed read-only PRAGMA quick_check.
  • Running Git through login zsh succeeds in approximately 0.6 seconds.
  • Running Git through the separately bundled Node runtime succeeds in approximately 6 ms.
  • Existing conversation data loaded successfully without resetting the profile.

Expected behavior / suggested investigation

Desktop initialization should preserve libuv's child-exit handling.

Please investigate initialization ordering between Chromium's placeholder SIGCHLD registration and libuv. Preserving the existing handler, or ensuring libuv registers after Chromium initialization, appears to address the observed failure.

The debugger intervention was diagnostic only, not a proposed production patch. It used a build-specific handler identification; no permanent workaround was installed.

Activity

  1. added
    bugSomething isn't working
    appIssues related to the Codex desktop app
    on Sep 27, 2026
  2. smturtle2 commented on Sep 27, 2026

    @smturtle2
    Author

    This report appears to share the underlying defect described in #48554, but adds an independent controlled test on CachyOS.

    A baseline run under GDB reproduced the failure. A second run changed only the act argument of the identified no-op sigaction(SIGCHLD, ...) registration to NULL, preserving libuv's handler. No preload library or on-disk application patch was used.

    With the same application version, profile, configuration, and existing conversation, this single intervention eliminated the observed zombie children and restored loading: thread/resume completed in 467 ms and content became visible in 1512 ms.

    This provides additional causal evidence for the handler-overwrite mechanism, independently of the preload workaround. This is supporting evidence for the same defect, not a claim of a separate bug.

  3. jazeem-azeez commented on Sep 27, 2026

    @jazeem-azeez

    Confirmed on Pop!_OS 22.04, x86_64, kernel 7.1.1: ChatGPT Desktop 26.924.22138 left
    existing conversations loading and new chats waiting for a response. Reinstalling
    26.917.71314 and restarting the app restored conversation loading. The same profile and
    chat data were preserved; no profile reset was needed.

  4. yuzhu-oai commented on Sep 28, 2026

    @yuzhu-oai
    Contributor

    The issue has been fixed. Please update to the latest version.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    LinuxappIssues related to the Codex desktop appbugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions