You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
orchestrator: seed the arch's KASLR facts before components run
On a !KASLR_SUPPORTED arch the orchestrator synthesises
SF_VIRT_KASLR_DISABLED + SF_PHYS_KASLR_DISABLED so the engine takes the
arch-off signal the way it takes a detector's. They were appended at summary
time, after every component had had its turn at a 64-slot table, and a full
table dropped them with no record — the one evidence loss that never reached
the discard ledger. JSON then reported kaslr.disabled false on an arch where
KASLR cannot exist.
The facts depend on nothing observed, so they are seeded first, into an empty
table, where they cannot be crowded out. Any later overflow belongs to a
component, where capture_scalar() already caps and records it. This splits
inject_kaslr_defaults() at the seam between its two times: seeding what the
arch settles before anything is observed, and projecting the collected facts
onto the summary afterwards, which must still run last because its scan reads
the whole table.
The bounds test stays, now recording instead of returning quietly. It no
longer guards a full table — it guards a future caller moving this after
capture, where unconditional writes would run off the end of one.
Copy file name to clipboardExpand all lines: docs/testing.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -132,6 +132,7 @@ and `make` halts on the first.
132
132
|`check-extent-callers`| only reviewed whole-map components call `kasld_result_extent` (the covering-completeness contract; a partial map would carve a false gap) |
133
133
|`check-discard-accounting`| the shipped binary, with its worker pool running, counts discards exactly — N components x M bad wire records must yield total N*M in N kinds, repeated. The unit tests are single-threaded and their build defines no `HAVE_PTHREAD`, so nothing else exercises the ledger's mutex; probabilistic, so a failure is conclusive and a pass is evidence |
134
134
|`check-discard-report`| the ledger's two renderings agree with a store actually full — a component overflows `MAX_SCALAR_FACTS`, the ledger is driven past its own `MAX_DISCARDS`, and the component directory past `MAX_COMPONENTS`; `--verbose` and `-j` must name the same total, reason and source, the capacity detail sentence must be printed, and the total must keep counting after the breakdown caps. Counts are differential, since the absolute overflow depends on what else populated the store — which varies by build, not by tool |
135
+
|`check-scalar-seed-order`| the arch's compile-time KASLR-off facts are seeded into `scalar_facts[]` before the phase loop, and only `capture_scalar()` and `seed_arch_kaslr_facts()` append to it — appended at summary time instead, the pair competed with components for a 64-slot table and a full table dropped it with no ledger entry; the ordering is invisible to the suite, which stays at full marks with the call moved |
135
136
|`check-vantage-coverage`| every filesystem source `kasld_gather_vantage()` reads is staged by a test, the suite actually calls the gatherer, and the absent direction is asserted — the gatherer was once constrained by nothing at all, a `memset` stub leaving the suite green, because the tests named "vantage" asserted on the formatters over a hand-filled struct |
136
137
|`check-test-staging`| every test binary stages its filesystem through `test_sysroot.h`, which names the root after the binary and registers its own removal — fifteen tests each carried a private `mkdtemp`, of which eleven removed nothing, so a passing suite left a tree per binary under `/tmp` to accumulate indefinitely, with nothing ever failing |
137
138
|`check-discard-ledger`| every reason in the discard vocabulary has a wire name, no layer keeps a private drop-counter beside the ledger, and the renderers read it through its accessors — a run that discarded evidence resolved from a subset of what was available, so a consumer unable to see the discard reads a bounded answer as a complete one |
0 commit comments