From: Kirill A. Korinsky Subject: usr.sbin/ifstated: timestamp sync external tests To: OpenBSD tech Date: Fri, 15 May 2026 12:02:50 +0200 tech@, When external_exec() runs a test synchronously, it refreshes prevstatus but left lastexec unchanged. A later status change could therefore be ignored by eval_state(), because that code gates body evaluation on the first external test timestamp for the current state. Set lastexec together with prevstatus for synchronous runs; this keeps the cached test status and execution time consistent across state re-entry. Reproducer: enter_two = '"test -f /tmp/ifstated-repro/enter_two" every 1' slow_false = '"false" every 2' go_back = '"test -f /tmp/ifstated-repro/go_back" every 1' leave_once = '"test -f /tmp/ifstated-repro/leave_once" every 1' run "rm -rf /tmp/ifstated-repro" run "mkdir -p /tmp/ifstated-repro" state one { init { run "rm -f /tmp/ifstated-repro/enter_two /tmp/ifstated-repro/go_back /tmp/ifstated-repro/leave_once" run "( sleep 1; touch /tmp/ifstated-repro/enter_two ) &" } if $enter_two { run "rm -f /tmp/ifstated-repro/enter_two" set-state two } } state two { init { run "rm -f /tmp/ifstated-repro/enter_two /tmp/ifstated-repro/go_back /tmp/ifstated-repro/leave_once" run "if test -f /tmp/ifstated-repro/seen_two; then touch /tmp/ifstated-repro/go_back; else touch /tmp/ifstated-repro/seen_two; ( sleep 3; touch /tmp/ifstated-repro/leave_once ) & fi" } if $slow_false || $go_back { run "touch /tmp/ifstated-repro/returned" set-state one } if $leave_once set-state one } Ok? Index: usr.sbin/ifstated/ifstated.c =================================================================== RCS file: /home/cvs/src/usr.sbin/ifstated/ifstated.c,v diff -u -p -r1.68 ifstated.c --- usr.sbin/ifstated/ifstated.c 23 Apr 2024 13:34:51 -0000 1.68 +++ usr.sbin/ifstated/ifstated.c 14 May 2026 21:34:57 -0000 @@ -340,8 +340,10 @@ external_exec(struct ifsd_external *exte if (!async) { waitpid(external->pid, &s, 0); external->pid = 0; - if (WIFEXITED(s)) + if (WIFEXITED(s)) { external->prevstatus = WEXITSTATUS(s); + external->lastexec = time(NULL); + } } } -- wbr, Kirill