- P0 path-traversal fix: run-name class is dot-free with \z anchors, so
'.', '..', and %0A-trailing values can never escape TRIMSP_TMPROOT. The
deployed path allowlist is derived from the configured root instead of the
old hardcoded /tmp prefix.
- Replacing external with an alarm() watchdog that kills the
engine's whole process group (setpgrp + kill KILL -pid), matching
muSRFlow; describe_result maps -2/-1/signal to 124/127/128+sig.
- prune_stale_jobs() ages out dirs (TrimSP.cfg marker only), orphaned .tgz,
and leaked per-request logs; safe in shared /tmp (symlinks skipped,
remove_tree safe mode, never touches non-trimsp dirs).
- Archive is serialized per run with flock (.trimsp-lock); per-point engine
runs stay concurrent.
- Symlink/non-dir run dirs refused; mode 0700 so results are not
world-readable. read/download also reject symlinked targets.
- Request caps: MAX_REQUEST_LINES 20000, MAX_REQUEST_BYTES 4 MiB -> 413.
- action=health deployment self-check; env overrides TRIMSP_BIN, TMPROOT,
CMD_TIMEOUT, JOB_MAXAGE (sed anchor for the binary path kept intact).
- Wire contract preserved: ok/phase/message/exitCode/archiveUrl/log JSON,
text read, gzip download, real HTTP statuses. No TrimSPweb.js change.
- New tests/cgi-tests.sh drives the real CGI offline (18 cases: traversal,
%0A, escaping round-trip, success/fail/hang engine, 124 watchdog, archive+-
download, pruner, symlink refusal, 413). deploy-web.sh now verifies the
sed substitution embedded the selected engine path.
- Expand From/Step/To scans count-based so descending (negative-step)
scans work, reject zero/unreachable ranges, and cap points at 5000
- Give parse_formula an unbalanced-bracket guard instead of an infinite
loop and use direct recursion
- Return {ok:false,error} from CreateInpFile and validate projectile,
layer composition, density, and thickness instead of the erroneous
ErrMsg/$ErrMsg path
- Freeze the RNG backend after prep_cfg refreshes All and pass it through
writeAsciiFileAsync so scans never mix generators mid-flight
- Wrap startSequence with a run-in-progress guard, disable the Run button,
and snapshot runWorkPath for all output writes
- Unify web/Electron readAsciiFileAsync to throw instead of returning 0
- Make checkDir synchronous (mkdirSync) and honor its return value
- Fix setValues/template substitution parsing and write web input files
byte-identical to Electron
- Track deferred seed-validation and input-cap work in ToDo.txt
Two Electron applications built from the identical electron binary set
package the same ELF build-id links under /usr/lib/.build-id, so
installing trimsp next to musrflow failed the transaction test. Define
_build_id_links none in the rpm spec so the package no longer claims
those paths, regardless of the el9 build host.