--- id: "bug-1722" status: "fixed" status_updated: "2026-09-24" status_note: "" component: "lib" severity: "crash" timestamp: "2026-08-27T00:00:00Z" last_seen: "2026-09-19T09:00:00Z" occurrences: 1 files: ["src/lib/xcealloc.c"] tags: ["heap-buffer-overflow", "asan", "xcealloc", "multi-host-job", "make_job_account", "make_host_allocs", "pre-existing"] related: ["bug-1621"] legacy: true --- # bug-1722: AddressSanitizer heap-buffer-overflow in make_job_account() (src/lib/xcealloc.c:188), WRITE of… ## Description AddressSanitizer heap-buffer-overflow in make_job_account() (src/lib/xcealloc.c:188), WRITE of size 8 -- found while verifying viability of a proposed scheduler snapshot-allocation-capture fix, not user-reported. ## Environment _Not recorded (migrated from buglog.json)._ ## Reproduction _Not recorded (migrated from buglog.json)._ ## Root cause make_job_account() allocates account->accounts via calloc(1, sizeof(xce_host_account_t*)) -- room for exactly 1 host pointer -- but its own loop writes account->accounts[i] for i in [0, jalloc->nhosts), overflowing the heap allocation for any job spanning more than one host. Already reachable from live production dispatch (core_events.c:262, schedobj.c:207, scheduler.c:1444) for any multi-host job, not introduced by this session. Sibling function make_host_allocs() (xcealloc.c:134) has the identical bug shape (calloc(1, ...) vs a loop writing hallocs[i] up to nhosts-1), though every current call site happens to pass nhosts=1 so it has never actually overflowed in production -- still a live footgun for any future 2+-host caller of a public, exported helper. ## Fix FIXED, TDD RED->GREEN. New test_xcealloc.c (src/lib/testsuite/, wired into libxce_test_src in meson.build + test.c) drives a 2-host xce_job_alloc_t through make_job_account(), reproducing the exact ASAN heap-buffer-overflow at xcealloc.c:188 pre-fix. Fix: both calloc(1, ...) call sites changed to calloc((size_t)nhosts, ...) / calloc((size_t)jalloc->nhosts, ...) -- xcealloc.c:134 (make_host_allocs) and xcealloc.c:180-181 (make_job_account). Also added a covering test for make_host_allocs multi-host correctness. Verified: full libxce test suite 303/303 (was 301, +2 new), scheduler suite 53/54 (1 pre-existing unrelated bug-1560 flake, test_recordstart_symlink_escape_replies_error), controller suite 1211/1213 (2 pre-existing unrelated bug-1561 overlayfs flakes, test_conf_trim_keeps_only_n_versions/test_conf_get_saved_tag_no_config) -- zero regressions, zero new failures. ## Verification _Not recorded (migrated from buglog.json)._ ## References - Related: bug-1621