77 lines
3.1 KiB
Diff
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.
|