diff --git a/regress/control-client-run-shell-exit.sh b/regress/control-client-run-shell-exit.sh new file mode 100644 index 000000000..e8acc0419 --- /dev/null +++ b/regress/control-client-run-shell-exit.sh @@ -0,0 +1,38 @@ +#!/bin/sh + +# A waited run-shell command can complete after a control client has closed its +# input and exited. The command queue still references the client until the job +# callback runs, but control_stop has already destroyed c->control_state. Late +# command output must be discarded instead of dereferencing the stopped control +# state and killing the server. + +PATH=/bin:/usr/bin +TERM=screen + +[ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux) +TMUX="$TEST_TMUX -Ltest" +$TMUX kill-server 2>/dev/null + +OUT=$(mktemp) +trap "$TMUX kill-server 2>/dev/null; rm -f $OUT" 0 1 15 + +$TMUX -f/dev/null new-session -d -s main || exit 1 + +printf '%s\n' 'run-shell "sleep 0.2; echo TEST"' | + $TMUX -f/dev/null -C >"$OUT" 2>&1 + +sleep 1 + +$TMUX has-session -t main 2>/dev/null || { + echo "server exited after late run-shell output" + cat "$OUT" + exit 1 +} + +grep -q '^%exit' "$OUT" || { + echo "control client did not exit" + cat "$OUT" + exit 1 +} + +exit 0