_gtaskqueue_start_threads() reports total thread-creation failure as success; queue teardown lifecycle is stubbed, so a half-born queue silently hangs all future drainers
| Field | Value |
|---|---|
| ID | DF-2850 |
| Status | new |
| Severity | Low |
| CVSS 3.1 | CVSS:3.1/AV:L/AC:H/PR:H/UI:N/S:U/C:N/I:N/A:L |
| CWE | CWE-755 Improper Handling of Exceptional Conditions |
| File | sys/kern/subr_gtaskqueue.c |
| Lines | 455-471 (dead teardown :147-160/:801-804) |
| Area | kern |
| Confidence | certain |
| Discovered | 2026-09-02 |
| Pass | 2 (GLM 5.3 second pass) |
| Bucket | base:kern |
| Reported | pending |
| Known CVE | none |
| CVE match | novel |
Summary
If lwkt_create() fails, _gtaskqueue_start_threads() NULLs the slot,
skips tq_tcount++ and still returns 0 unconditionally — the comment's
promised cleanup points at gtaskqueue_free(), which is static
__unused dead code, and taskqgroup_destroy() is an empty stub. A
queue whose threads failed to start still accepts enqueues and wakes
nobody; its tasks never run; any drain on it sleeps forever (timo=0)
with no error. Silent permanent kernel-thread hang under thread-table/
kmem exhaustion at queue-start time. No deterministic guest PoC
(code-path analysis; findings/poc/DF-2850/NOTES.md).
Recommended fix
Track successful creates, tear down partial state and return the error; make TASKQGROUP_DEFINE's SYSINIT treat a failed queue as fatal at boot; implement or delete the dead destroy/free declarations.
Timeline
- 2026-09-02 Discovered during pass-2 audit of subr_gtaskqueue.c (GLM 5.3).
No comments yet.