docs(xce-test-cli-ux): verify the confirmation gate end-to-end (task 4.2)
Live-cluster validation, no source changes: independently reproduced (implementer + reviewer, separate deploys) that all five destructive commands prompt by default, treat decline and real-SIGINT identically as "not run" (not "failed", the deliberate Req 9.9 exception to Req 1.3), skip the prompt under --yes/non-interactive/session-toggle, and match Req 9.5's exact enumeration including its reversal-action exclusions. Logs bug-1796 (misleading perror() text from stale errno in cmd_qctrl/hostctrl/jobkill) and bug-1797 (cmd_qctrl queue-name leak on the RPC-error path) as pre-existing, deliberately-deferred findings. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019jaMf9QEwpugH2W9KAuc7f
This commit is contained in:
parent
18aa736665
commit
f6793a24f1
2 changed files with 53 additions and 1 deletions
|
|
@ -21591,6 +21591,57 @@
|
|||
],
|
||||
"occurrences": 1,
|
||||
"last_seen": "2026-09-09T20:10:00Z"
|
||||
},
|
||||
{
|
||||
"id": "bug-1796",
|
||||
"timestamp": "2026-09-09T22:00:00Z",
|
||||
"error_message": "cmd_qctrl/cmd_hostctrl/cmd_jobkill's RPC-failure branches perror() a fixed label (e.g. \"xcecli_queuectrl\") without ever setting errno to reflect the RPC's actual returned status, so the printed reason (e.g. \"Interrupted system call\", \"Resource temporarily unavailable\", \"Inappropriate ioctl for device\") is whatever errno happened to be left over from an unrelated earlier libc call in the same process, not the real failure reason.",
|
||||
"file": "src/controller/testsuite/test.c (cmd_qctrl, cmd_hostctrl, cmd_jobkill RPC-error return paths)",
|
||||
"root_cause": "Each of these commands does `if (rc < 0) { perror(\"xcecli_...\"); return rc; }` where `rc` is the RPC's own negative-errno-style return value (e.g. a clean -ENOENT for \"no such queue/host\"), but perror() always reads the CURRENT process errno, not `rc` -- and nothing in this branch ever does `errno = -rc` first. Found during xce-test-cli-ux task 4.2's live confirmation-gate verification: a bypassed qctrl/hostctrl RPC against a deliberately bogus (nonexistent) queue/host name printed different, unrelated-looking error text across different runs of the SAME scenario, root-caused (and independently reproduced 3 times by the task 4.2 reviewer) to stale errno left over from prior, unrelated syscalls/signal-decline paths in the same process -- e.g. a destructive-command Ctrl-C decline explicitly sets errno = EINTR at its own call site and never resets it, so a LATER unrelated RPC failure in the same session then misreports itself as \"Interrupted system call\". Confirmed pre-existing (commit 41f56fa6e, 2025-11-05), predating the whole xce-test-cli-ux spec; NOT a defect in the interruptible-call adapter (tasks 1.4/3.2) or the confirmation gate (task 2.1/3.3) -- both were independently confirmed to behave correctly in every case tested, this is purely a misleading-diagnostic-text bug.",
|
||||
"fix": "NOT YET FIXED (found and deliberately deferred -- out of boundary for task 4.2, a pure live-verification task with no source changes permitted). Recommended: set `errno = -rc;` immediately before each `perror(...)` call on these RPC-error paths (or replace with `fprintf(stderr, \"...: %s\\n\", strerror(-rc));` to avoid the errno indirection entirely), and audit other cmd_* handlers for the same perror()-without-errno-set pattern.",
|
||||
"tags": [
|
||||
"controller",
|
||||
"testsuite",
|
||||
"xce_test",
|
||||
"cmd_qctrl",
|
||||
"cmd_hostctrl",
|
||||
"cmd_jobkill",
|
||||
"perror",
|
||||
"errno",
|
||||
"misleading-diagnostic",
|
||||
"xce-test-cli-ux",
|
||||
"task-4.2",
|
||||
"pre-existing",
|
||||
"deferred"
|
||||
],
|
||||
"related_bugs": [],
|
||||
"occurrences": 1,
|
||||
"last_seen": "2026-09-09T22:00:00Z"
|
||||
},
|
||||
{
|
||||
"id": "bug-1797",
|
||||
"timestamp": "2026-09-09T22:00:00Z",
|
||||
"error_message": "cmd_qctrl leaks its strdup()'d queue name on the xcecli_queuectrl() RPC-error return path (ASAN LeakSanitizer-confirmed, 14 bytes).",
|
||||
"file": "src/controller/testsuite/test.c (cmd_qctrl)",
|
||||
"root_cause": "cmd_qctrl does `queue = strdup(optarg)` while parsing -q, then on `if (rc < 0) { perror(\"xcecli_queuectrl\"); return rc; }` (the RPC-error branch) returns without `free(queue)` -- only the success path frees it. Distinct from the adjacent, intentional non-free on the EINTR/abandoned-worker path (ownership legitimately transferred there per the interruptible-call adapter's contract). Found during xce-test-cli-ux task 4.2's live confirmation-gate verification (a bypassed qctrl against a bogus queue name triggered this exact RPC-error branch under the asan build). Confirmed pre-existing (commit 41f56fa6e, 2025-11-05), predating the whole xce-test-cli-ux spec and untouched by task 3.1's flagspec migration; not caused by any change in this spec.",
|
||||
"fix": "NOT YET FIXED (found and deliberately deferred -- out of boundary for task 4.2, a pure live-verification task with no source changes permitted). Recommended: add `free(queue);` on the RPC-error return path (or restructure with a single cleanup label), and check `cmd_hostctrl`/`cmd_jobkill`'s sibling strdup'd-argument fields for the same pattern.",
|
||||
"tags": [
|
||||
"controller",
|
||||
"testsuite",
|
||||
"xce_test",
|
||||
"cmd_qctrl",
|
||||
"leak",
|
||||
"asan",
|
||||
"xce-test-cli-ux",
|
||||
"task-4.2",
|
||||
"pre-existing",
|
||||
"deferred"
|
||||
],
|
||||
"related_bugs": [
|
||||
"bug-1796"
|
||||
],
|
||||
"occurrences": 1,
|
||||
"last_seen": "2026-09-09T22:00:00Z"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue