Proof Portal
Omarchy
ProbeLabs65 findings · 95 requirementsA proof layer — requirements, tests and verified fixes — for two of Omarchy's subsystems: the application menu (launcher scripts, QML model, JSONC config, search and selection) and the lock screen (lock scripts, QML, PAM authentication). Scope is deliberately limited to those components of omacom/omarchy; the rest of the distribution is not covered.
`omarchy-screensaver` SIGSEGV: trap handler signals parent terminal and re-enters until stack overflow
Reported by enhapu-afk · filed Aug 29, 2026Closed upstream on 2026-10-09 by the bot omarchybot, as a duplicate (target not recorded).
At a glance
- 1 · What is claimed?
- Only the report text below — no validator has restated it as checkable claims yet.
- 2 · What does it affect?
- Not yet mapped to any requirement or component.
- 3 · Is it reproducible?
- No validation has been run yet.
- 4 · What remains unclear?
- Not validated yet: no claims, no reproducer.
- 5 · What happens next?
- Our staff decide whether the report is valid. Where this project allows it, agents decide whether it duplicates another report or a known issue. No decision has been recorded yet.
Original report
What happened
Idle launched the screensaver. About 47 seconds later Hyprland closed the org.omarchy.screensaver window (screensaver-dismissed). ~54 seconds after that, bash dumped core:
- process:
/bin/bash /usr/share/omarchy/bin/omarchy-screensaver(PID 114919) - signal: SIGSEGV,
si_code= SI_KERNEL - time: Sat 2026-08-29 18:44:51 CEST
The core has ~63,500 frames of run_pending_traps → parse_and_execute → execute_command_internal. The bottom of the stack is read_builtin / zread (the script's read -n1 -t 1 wait). The crashing instruction is a stack probe in push_source (orb $0x0,(%rsp)). This is stack overflow from nested trap handling, not a null deref in bash.
What was expected
Dismissing the screensaver should restore the cursor, stop ttfx, close the screensaver terminals, and exit 0.
Why
bin/omarchy-screensaver both handles and generates the same signals:
exit_screensaver() {
hyprctl eval 'hl.config({ cursor = { invisible = false } })' &>/dev/null || hyprctl keyword cursor:invisible false &>/dev/null || true
pkill -x ttfx 2>/dev/null
pkill -f '[o]rg.omarchy.screensaver' 2>/dev/null
exit 0
}
trap exit_screensaver SIGINT SIGTERM SIGHUP SIGQUITThe terminal is launched as ghostty --class=org.omarchy.screensaver … -e omarchy-screensaver. That pkill -f pattern SIGTERMs the parent terminal. The parent then SIGTERM/SIGHUPs bash, whose trap is exit_screensaver again. The handler never unsets the trap before signalling the parent, so it nests until the 16 MiB stack is exhausted.
The 54s gap between window close and SIGSEGV matches thousands of nested handler runs (hyprctl + pkill) while the terminal can stay alive waiting on a child that never reaches exit 0.
Not OOM (108 GiB available). One recorded coredump.
Steps to reproduce
- Leave the machine idle until
omarchy-launch-screensaverstarts (Ghostty, classorg.omarchy.screensaver). - Dismiss it (key, or anything that delivers SIGTERM/SIGHUP to the script / parent terminal).
coredumpctl listshows bash /omarchy-screensaverSIGSEGV.
Suggested fix
Unset or ignore SIGINT/SIGTERM/SIGHUP/SIGQUIT at the start of exit_screensaver, before signalling other screensaver processes. Or don't signal the parent terminal from inside the child; just exit.
System
- Omarchy 4.0.1-1
- bash 5.3.15-1
- ghostty 1.3.1-2
- hyprland 0.56.2-1
- ttfx 0.3.2-1
- Hostname EVOx3 (GMKtec EVO-X3, AMD RYZEN AI MAX+ 395, Hyprland 0.56.2, kernel 7.1.9-arch1-2)
- Default terminal: Ghostty; one monitor (DP-2)
omarchy-debug --no-sudo --print was captured locally (/tmp/omarchy-debug.log if the command wrote one).
Filed by Grok 4.6 via Grok Build TUI.
View raw text
### What happened
Idle launched the screensaver. About 47 seconds later Hyprland closed the `org.omarchy.screensaver` window (`screensaver-dismissed`). ~54 seconds after that, bash dumped core:
- process: `/bin/bash /usr/share/omarchy/bin/omarchy-screensaver` (PID 114919)
- signal: SIGSEGV, `si_code` = SI_KERNEL
- time: Sat 2026-08-29 18:44:51 CEST
The core has ~63,500 frames of `run_pending_traps` → `parse_and_execute` → `execute_command_internal`. The bottom of the stack is `read_builtin` / `zread` (the script's `read -n1 -t 1` wait). The crashing instruction is a stack probe in `push_source` (`orb $0x0,(%rsp)`). This is stack overflow from nested trap handling, not a null deref in bash.
### What was expected
Dismissing the screensaver should restore the cursor, stop `ttfx`, close the screensaver terminals, and exit 0.
### Why
`bin/omarchy-screensaver` both handles and generates the same signals:
```bash
exit_screensaver() {
hyprctl eval 'hl.config({ cursor = { invisible = false } })' &>/dev/null || hyprctl keyword cursor:invisible false &>/dev/null || true
pkill -x ttfx 2>/dev/null
pkill -f '[o]rg.omarchy.screensaver' 2>/dev/null
exit 0
}
trap exit_screensaver SIGINT SIGTERM SIGHUP SIGQUIT
```
The terminal is launched as `ghostty --class=org.omarchy.screensaver … -e omarchy-screensaver`. That `pkill -f` pattern SIGTERMs the parent terminal. The parent then SIGTERM/SIGHUPs bash, whose trap is `exit_screensaver` again. The handler never unsets the trap before signalling the parent, so it nests until the 16 MiB stack is exhausted.
The 54s gap between window close and SIGSEGV matches thousands of nested handler runs (hyprctl + pkill) while the terminal can stay alive waiting on a child that never reaches `exit 0`.
Not OOM (108 GiB available). One recorded coredump.
### Steps to reproduce
1. Leave the machine idle until `omarchy-launch-screensaver` starts (Ghostty, class `org.omarchy.screensaver`).
2. Dismiss it (key, or anything that delivers SIGTERM/SIGHUP to the script / parent terminal).
3. `coredumpctl list` shows bash / `omarchy-screensaver` SIGSEGV.
### Suggested fix
Unset or ignore SIGINT/SIGTERM/SIGHUP/SIGQUIT at the start of `exit_screensaver`, before signalling other screensaver processes. Or don't signal the parent terminal from inside the child; just `exit`.
### System
- Omarchy 4.0.1-1
- bash 5.3.15-1
- ghostty 1.3.1-2
- hyprland 0.56.2-1
- ttfx 0.3.2-1
- Hostname EVOx3 (GMKtec EVO-X3, AMD RYZEN AI MAX+ 395, Hyprland 0.56.2, kernel 7.1.9-arch1-2)
- Default terminal: Ghostty; one monitor (DP-2)
`omarchy-debug --no-sudo --print` was captured locally (`/tmp/omarchy-debug.log` if the command wrote one).
Filed by Grok 4.6 via Grok Build TUI.
Validation
Not checked yet. A validator will restate this report as checkable claims, map it to the project's requirements and write a reproducer that the proof engine runs.
Linked
- Related PRpr/6813· confirmed
Decision
Decisions are recorded by our staff — or, where this project allows it, by agents: checked by a second, independent agent, or by a single agent where the project's policy says so. Any decision reached so far is shown below.
No decision has been recorded yet.