Files

77 lines
3.1 KiB
Diff

--- a/scripts/case2-unit.sh
+++ b/scripts/case2-unit.sh
@@ -163,5 +163,3 @@
- local pid="$1" raw rest
- if ! raw="$(<"/proc/$pid/stat")" 2>/dev/null; then
- [ -e "/proc/$pid/stat" ] && return 1
- return 3
- fi
+ local pid="$1" raw="" rest
+ # EOF is expected: stat has no NUL. Decide on content, not read's status.
+ IFS= read -r -d '' raw < "/proc/$pid/stat" 2>/dev/null || :
@@ -181,3 +179 @@
- local entry pid rc live until
- clock_cs || return 1
- until=$((CLOCK_CS + 25))
+ local entry pid rc live until=""
@@ -200,0 +197,2 @@
+ # Inventory pass 1 is outside the bounded confirmation/retry budget.
+ [ -n "$until" ] || until=$((CLOCK_CS + 25))
@@ -221 +219,2 @@
-for ((attempt=0; attempt<100; attempt++)); do
+# Allow session creation the whole inner budget, rather than a 200 ms margin.
+while :; do
--- a/scripts/case1-accept.sh
+++ b/scripts/case1-accept.sh
@@ -121,5 +121,3 @@
- local pid="$1" raw rest
- if ! raw="$(<"/proc/$pid/stat")" 2>/dev/null; then
- [ -e "/proc/$pid/stat" ] && return 1
- return 3
- fi
+ local pid="$1" raw="" rest
+ # EOF is expected: stat has no NUL. Decide on content, not read's status.
+ IFS= read -r -d '' raw < "/proc/$pid/stat" 2>/dev/null || :
@@ -139,3 +137 @@
- local entry pid rc live until
- clock_cs || return 1
- until=$((CLOCK_CS + 25))
+ local entry pid rc live until=""
@@ -158,0 +155,2 @@
+ # Inventory pass 1 is outside the bounded confirmation/retry budget.
+ [ -n "$until" ] || until=$((CLOCK_CS + 25))
@@ -179 +177,2 @@
-for ((attempt=0; attempt<100; attempt++)); do
+# Allow session creation the whole inner budget, rather than a 200 ms margin.
+while :; do
--- a/packages/cli/tests/case2-unit.test.mjs
+++ b/packages/cli/tests/case2-unit.test.mjs
@@ -236,0 +237,22 @@
+});
+
+test('row253 C4 cleanup budget starts after inventory pass one',()=>{
+ // A deterministic clock models a slow inventory without host-load timing.
+ // All process reads and signals are stand-ins; no real PID is signalled.
+ const source=read(UNIT);
+ const body=source.slice(source.indexOf('stat_fields() {'),source.indexOf('finish() {'));
+ const standins=`
+child=424242; sleep_bin=:; seen=0; clocks=0; kills=0
+stat_fields() {
+ seen=$((seen+1)); ST_STATE=R; ST_SESSION=0
+ [ "$seen" != 1 ] || ST_SESSION="$child"
+ return 0
+}
+clock_cs() { clocks=$((clocks+1)); CLOCK_CS=$((clocks*1000)); }
+kill() { kills=$((kills+1)); return 0; }
+clean_session; rc=$?
+printf '%s' "$kills"
+exit "$rc"
+`;
+ const r=spawnSync('/bin/bash',['-c',body+standins],{encoding:'utf8'});
+ assert.equal(r.status,0,r.stderr);assert.equal(r.stdout,'1');
--- a/docs/plans/DEFERRED.md
+++ b/docs/plans/DEFERRED.md
@@ -461,0 +462,2 @@
+
+Row 276 / #1781 also owns the case1 root-side capture/tools mutant counterparts (duckworth-0112 N1) and documenting the setuid-member cleanup refusal in the headers (N2). A member that changes uid and cannot be killed causes inner-cleanup refusal, never successful observation. N4 is addressed in row253 by allowing SID confirmation until the existing inner watchdog expires, instead of a separate 200 ms scheduling margin.