Proof Portal

Project overview

Omarchy

ProbeLabs65 findings · 95 requirements

A 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.

Inbox
ReportR-4846GitHub issuePublicReceived

Fingerprint PAM race condition crashes quickshell (SIGSEGV)

Reported by echodust · filed Sep 2, 2026Closed upstream on 2026-09-21 by bjarneo via an automated message, as a duplicate of #7645 (R-1610). GitHub close reason: completed.

Received and recorded verbatim. Nothing has been checked yet.

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

Fingerprint PAM race condition crashes quickshell (SIGSEGV)revision 1 · captured 2026-10-04 12:10 UTC via poll

What happened

quickshell (the Omarchy shell panel) crashed with SIGSEGV while performing fingerprint authentication on the lock screen. The process was running quickshell -n -p /usr/share/omarchy/shell.

Timeline

TimeEvent
08:30:41First fingerprint PAM subprocess starts, asks user to place finger
08:30:53–545 more PAM subprocesses spawn in rapid succession (250ms retry timer)
08:30:53–54fprintd rejects all but the first: "Device was already claimed"
08:31:11quickshell crashes with SIGSEGV (SI_TKILL — self-inflicted, likely assertion/abort)

Backtrace

#0  0x00007f8d2689a17c n/a (libc.so.6 + 0x9a17c)
#1  0x00007f8d2683e5d0 raise (libc.so.6 + 0x3e5d0)
#2  0x000055a7f46ee389 n/a (quickshell + 0x124389)
#3  0x00007f8d2683e6f0 n/a (libc.so.6 + 0x3e6f0)
#4  0x00007f8d2a1d89c2 n/a (libjemalloc.so.2 + 0x1d9c2)
#5  0x000055a7f4892966 n/a (quickshell + 0x2c8966)
#6  0x00007f8d1cbc82e5 n/a (pam_fprintd.so + 0x22e5)
#7  0x00007f8d1cbc91f6 n/a (pam_fprintd.so + 0x31f6)
#8  0x00007f8d1cbc9b59 pam_sm_authenticate (pam_fprintd.so + 0x3b59)
#9  0x00007f8d29ef32ff n/a (libpam.so.0 + 0x92ff)
#10 0x00007f8d29ef3b04 pam_authenticate (libpam.so.0 + 0x9b04)
#11 0x000055a7f4885fe4 n/a (quickshell + 0x2bbfe4)
#12 0x000055a7f4887232 n/a (quickshell + 0x2bd232)
#13 0x000055a7f4887b07 n/a (quickshell + 0x2bdb07)
#14 0x00007f8d27d66663 n/a (libQt6Qml.so.6 + 0x366663)
#15 0x00007f8d27c0212b n/a (libQt6Qml.so.6 + 0x20212b)

Read bottom-up: QML JavaScript engine fires a signal handler → quickshell calls pam_authenticate() → pam_fprintd.so attempts fingerprint claim → crash inside quickshell's PAM integration code.

Root cause

Race condition in plugins/lock/Service.qml:209–216. The 250ms fingerprintRetryTimer fires while a previous PAM context is still active or in a bad state. The guard check (if (fingerprintPam.active || fingerprintAuthenticating) return) has a window between the check and fingerprintPam.start() where a second attempt can slip through, causing fprintd to reject the claim and leaving the PAM context in a corrupt state.

function startFingerprint() {
  if (!lockRequested || !sessionLock.secure || !fingerprintConfigured) return
  if (fingerprintPam.active || fingerprintAuthenticating) return

  fingerprintAuthenticating = true
  if (!fingerprintPam.start()) {
    fingerprintAuthenticating = false
  }
}

The journal shows 5+ concurrent PAM attempts within 1 second, all rejected by fprintd with "Device was already claimed".

Environment

  • Omarchy: 4.0.2-1
  • quickshell: 0.3.1-1
  • Kernel: Linux x86_64
  • CPU: AMD Ryzen 7 5700U
  • Signal: SIGSEGV (SI_TKILL)

Impact

  • No data loss (shell restarted automatically by systemd)
  • Likely to recur when fingerprint reader is slow or ddcutil has I2C bus contention (also logged at crash time)
Filed by big-pickle via opencode.
View raw text
## What happened

quickshell (the Omarchy shell panel) crashed with SIGSEGV while performing fingerprint authentication on the lock screen. The process was running `quickshell -n -p /usr/share/omarchy/shell`.

## Timeline

| Time | Event |
|------|-------|
| 08:30:41 | First fingerprint PAM subprocess starts, asks user to place finger |
| 08:30:53–54 | 5 more PAM subprocesses spawn in rapid succession (250ms retry timer) |
| 08:30:53–54 | `fprintd` rejects all but the first: `"Device was already claimed"` |
| 08:31:11 | quickshell crashes with SIGSEGV (SI_TKILL — self-inflicted, likely assertion/abort) |

## Backtrace

```
#0  0x00007f8d2689a17c n/a (libc.so.6 + 0x9a17c)
#1  0x00007f8d2683e5d0 raise (libc.so.6 + 0x3e5d0)
#2  0x000055a7f46ee389 n/a (quickshell + 0x124389)
#3  0x00007f8d2683e6f0 n/a (libc.so.6 + 0x3e6f0)
#4  0x00007f8d2a1d89c2 n/a (libjemalloc.so.2 + 0x1d9c2)
#5  0x000055a7f4892966 n/a (quickshell + 0x2c8966)
#6  0x00007f8d1cbc82e5 n/a (pam_fprintd.so + 0x22e5)
#7  0x00007f8d1cbc91f6 n/a (pam_fprintd.so + 0x31f6)
#8  0x00007f8d1cbc9b59 pam_sm_authenticate (pam_fprintd.so + 0x3b59)
#9  0x00007f8d29ef32ff n/a (libpam.so.0 + 0x92ff)
#10 0x00007f8d29ef3b04 pam_authenticate (libpam.so.0 + 0x9b04)
#11 0x000055a7f4885fe4 n/a (quickshell + 0x2bbfe4)
#12 0x000055a7f4887232 n/a (quickshell + 0x2bd232)
#13 0x000055a7f4887b07 n/a (quickshell + 0x2bdb07)
#14 0x00007f8d27d66663 n/a (libQt6Qml.so.6 + 0x366663)
#15 0x00007f8d27c0212b n/a (libQt6Qml.so.6 + 0x20212b)
```

Read bottom-up: QML JavaScript engine fires a signal handler → quickshell calls `pam_authenticate()` → `pam_fprintd.so` attempts fingerprint claim → crash inside quickshell's PAM integration code.

## Root cause

Race condition in `plugins/lock/Service.qml:209–216`. The 250ms `fingerprintRetryTimer` fires while a previous PAM context is still active or in a bad state. The guard check (`if (fingerprintPam.active || fingerprintAuthenticating) return`) has a window between the check and `fingerprintPam.start()` where a second attempt can slip through, causing `fprintd` to reject the claim and leaving the PAM context in a corrupt state.

```qml
function startFingerprint() {
  if (!lockRequested || !sessionLock.secure || !fingerprintConfigured) return
  if (fingerprintPam.active || fingerprintAuthenticating) return

  fingerprintAuthenticating = true
  if (!fingerprintPam.start()) {
    fingerprintAuthenticating = false
  }
}
```

The journal shows 5+ concurrent PAM attempts within 1 second, all rejected by fprintd with "Device was already claimed".

## Environment

- Omarchy: 4.0.2-1
- quickshell: 0.3.1-1
- Kernel: Linux x86_64
- CPU: AMD Ryzen 7 5700U
- Signal: SIGSEGV (SI_TKILL)

## Impact

- No data loss (shell restarted automatically by systemd)
- Likely to recur when fingerprint reader is slow or ddcutil has I2C bus contention (also logged at crash time)

> Filed by big-pickle via opencode.

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

Not linked to any known issue, other report or change yet.

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.