diff --git a/.wolf/buglog.json b/.wolf/buglog.json index 4ae09b5d..abf5c200 100644 --- a/.wolf/buglog.json +++ b/.wolf/buglog.json @@ -18167,6 +18167,29 @@ ], "occurrences": 1, "last_seen": "2026-08-21T15:56:00Z" + }, + { + "id": "bug-1621", + "timestamp": "2026-08-22T08:12:00Z", + "error_message": "LeakSanitizer (run with ASAN_OPTIONS=detect_leaks=1, overriding this test suite's own detect_leaks=0 convention): 'Direct leak of 8 byte(s) ... #1 make_host_account ../lib/xcealloc.c:119 #2 make_job_account ../lib/xcealloc.c:188' -- an xce_host_account_t's `host` field (strdup'd in make_host_account(), src/lib/xcealloc.c:119) is never freed.", + "file": "src/lib/misc.c (free_host_account)", + "root_cause": "free_host_account() (src/lib/misc.c) frees acct->accounts[] (each via free_res_account()) and then FREEUP(acct) itself, but never FREEUP(acct->host) -- the strdup'd host string make_host_account() (src/lib/xcealloc.c:119, `haccount->host = strdup(halloc->host);`) allocates. Pre-existing, NOT introduced by scheduler-sim-decision-parity task 2.3: confirmed by tracing the leak's allocation stack, which bottoms out in make_job_account()/make_host_account() (xcealloc.c) -- the exact same tree-building code the LIVE dispatch path already uses (scheduler.c's sched_commit_decision() -> make_job_account()), so this leak equally exists on the live, production dispatch path today, just previously undetected because src/scheduler/testsuite/meson.build runs this whole suite with ASAN_OPTIONS=detect_leaks=0 (fixtures are deliberately not torn down in this test family, per test file header conventions -- masks this along with every other intentional fixture leak).", + "fix": "NOT FIXED -- out of boundary for task 2.3 (src/lib/misc.c was not in that task's editable file set; task 2.3's own boundary was sim_loop.c's Recorded-Decision Reconciliation component only). Discovered while verifying task 2.3's reconcile-then-release ASAN round-trip (test_reconcile_then_release_via_job_state_change_is_asan_clean, test_sim_reconcile_unaccounted.c) by re-running the standalone sched_sim_reconcile_unaccounted_test binary directly with ASAN_OPTIONS=detect_leaks=1 (overriding the meson-registered detect_leaks=0) specifically to check for leaks the registered test run cannot see. Zero double-free/use-after-free were found (task 2.3's own move-then-null-then-free ownership transfer is correct); this is the ONLY leak that traces through sim_reconcile_unaccounted_jobs, and it is entirely attributable to this pre-existing free_host_account() gap, not to task 2.3's own new code. Correct fix (for whoever picks this up): add `FREEUP(acct->host);` to free_host_account() in src/lib/misc.c, mirroring free_res_account()'s existing `FREEUP(acct->resname);` pattern immediately above it in the same file.", + "tags": [ + "memory-leak", + "asan", + "leaksanitizer", + "free_host_account", + "xcealloc", + "scheduler", + "resource-accounting", + "scheduler-sim-decision-parity", + "pre-existing", + "out-of-scope" + ], + "related_bugs": [], + "occurrences": 1, + "last_seen": "2026-08-22T08:12:00Z" } ] }