#!/bin/sh
# DF-5773 mechanism harness driver (runs storm_demo, the faithful
# extraction of init.c:204-230/500-506, with a bystander in the pgrp).
#
# Generation 1 child exits 32 after WINDOW seconds (cpu_reset analog)
# -> monitor reforks -> generation 2 child INHERITS handle_term
# -> TERM fired in its window -> kill(0, SIGTERM):
#    storm (self-re-arming) + group splash (bystander + this runner TERMed).
#
# EXPECTED (defect present): BYSTANDER_DEAD, RUNNER_GOT_SIGTERM,
# demo alive at ~100% CPU, second TERM useless, kill -9 required.
WINDOW=${1:-3}
cd /root/poc5773

rm -f /tmp/storm.obs
sleep 120 &
BYSTANDER=$!
trap 'echo RUNNER_GOT_SIGTERM >> /tmp/storm.obs' TERM

./storm_demo $WINDOW &
DEMO=$!
echo "demo=$DEMO bystander=$BYSTANDER window=$WINDOW" > /tmp/storm.obs

# gen1 exits at ~WINDOW; gen2's window is another ~WINDOW
sleep $(( WINDOW + WINDOW / 2 + 1 ))
echo "FIRING TERM at gen2 window" >> /tmp/storm.obs
kill -TERM $DEMO 2>/dev/null

sleep 3
kill -0 $BYSTANDER 2>/dev/null && echo BYSTANDER_ALIVE >> /tmp/storm.obs || echo BYSTANDER_DEAD_BY_SPLASH >> /tmp/storm.obs
kill -0 $DEMO 2>/dev/null && echo DEMO_ALIVE >> /tmp/storm.obs || echo DEMO_DEAD >> /tmp/storm.obs

kill -TERM $DEMO 2>/dev/null
sleep 2
kill -0 $DEMO 2>/dev/null && echo DEMO_STILL_ALIVE_AFTER_SECOND_TERM_storm_wedged >> /tmp/storm.obs || echo DEMO_DIED_SECOND_TERM >> /tmp/storm.obs

ps -o pid,ppid,%cpu,state,comm | grep -E "storm|PID" | head -5 >> /tmp/storm.obs
kill -9 $BYSTANDER $DEMO 2>/dev/null
pkill -9 storm_demo 2>/dev/null
cat /tmp/storm.obs
