myxce/src
Rongsong Shen 63de947305
fix(lib): zarray_fini/xlist_fini must reset caps/count, not just free data
A user-reported core dump showed xce_scheduler crashing with SIGSEGV in
its allocator thread: zarray_get_ex dereferencing a NULL array->data
inside match_job_host_limit_() (plugins/limit.c), reached via schedobj.c's
reset_sched_obj().

Root cause: zarray_fini() freed array->data and set it to NULL, but left
array->caps/count/pos at their stale pre-fini values instead of resetting
to the safe (0,0,0) state zarray_init() establishes. xlist_fini() had the
identical gap. Both structs' own bounds checks (`idx >= caps`) treat a
nonzero caps as a guarantee that data is a valid allocation -- a
guarantee broken for any caller that reuses the same struct after
_fini() without re-init.

schedobj.c's reset_sched_obj() does exactly that: it tears down a job's
own PERSISTENT schedobj (reused for the job's whole lifetime, not a
disposable scratch object) whenever the cluster's config version has
advanced, with no matching re-init. Once a host-limit match had grown
hlimits' capacity, and the config version bumped again while that job
sat PEND, the next allocation attempt for the same job dereferenced the
torn array -- exactly matching the reported backtrace. This same crash
class had already caused at least one earlier, never-successfully-root-
caused crash near the same call site (2026-08-17).

Fixed at the library-primitive level rather than reset_sched_obj()'s
call site: zarray_fini()/xlist_fini() now reset caps/count/pos to 0,
matching what _init() establishes. This makes every existing
_fini()-then-reuse caller correct by construction, with zero changes
needed at any call site. Audited every non-test zarray_fini()/
xlist_fini() call site first -- none relies on caps/count surviving
_fini(), so this is a pure safety improvement, not a behavior change.

RED confirmed by temporarily disabling both resets: new tests failed
cleanly ("Expected 0 Was 4" / "Expected 0 Was 2", the stale pre-fini
caps). GREEN confirmed restored: full lib suite 314/314, scheduler
suite 77/77, zero regressions.

bug-1817.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RLSNJhNoULvVcUhXEFafQC
2026-09-16 02:31:53 +00:00
..
autoscaler remove extralib 2026-09-04 11:24:43 +08:00
configs fix(scheduler): live-verify bug-1790 with a real global mem limit 2026-09-08 08:49:17 +00:00
controller fix: repoint stale controller/xce_test path references to harness/xce_test 2026-09-14 11:49:01 +00:00
docs feat(eliminate-frontend-makefile): task 3.3 - update live documentation (11 files) 2026-09-03 14:22:54 +00:00
frontend fix(apiserver): fix job control union discriminant, add human-readable job ID support (gitea#45) 2026-09-07 08:31:54 +00:00
harness fix(harness): reset getopt_long via optind=0 to stop cross-command corruption 2026-09-14 23:16:11 +00:00
include fix(scheduler): downgrade routine EEXIST resync log, dedup hash_string 2026-09-15 02:46:52 +00:00
lib fix(lib): zarray_fini/xlist_fini must reset caps/count, not just free data 2026-09-16 02:31:53 +00:00
nixSupport remove extralib 2026-09-04 11:24:43 +08:00
scheduler fix(scheduler): freeze mem-usage reconciliation for a RECONCILING/UNAVAIL worker too 2026-09-15 11:22:12 +00:00
schema feat(worker-rejoin-resync): task 6.1 - trigger reconciliation on rejoin 2026-09-01 19:43:18 +00:00
tools fix(xce-deploy-ha): stop a stale deploy's processes surviving a hand-typed cleanup mistake 2026-09-15 14:04:16 +00:00
worker fix(worker): stop treating systemd's UINT64_MAX sentinel as real rusage data 2026-09-15 11:21:55 +00:00
xceadmin build: make Go and Python builds fully offline (hermetic Nix build) 2026-09-03 12:38:49 +08:00
flake.lock remove extralib 2026-09-04 11:24:43 +08:00
flake.nix remove extralib 2026-09-04 11:24:43 +08:00
meson.build feat(xce-harness-component): relocate xce_test into standalone harness component 2026-09-14 05:08:15 +00:00
meson.options feat(dirty-content-fingerprint): add dirty_fingerprint meson option and C define 2026-08-21 03:54:37 +00:00