mirror of
https://github.com/troglobit/finit.git
synced 2026-10-29 12:40:44 +00:00
service: do not let a script timeout take PID 1 with it
A stop: or reload: script written with a timeout killed Finit at
config load:
service stop:5,/bin/true service.sh -- Boom
parse_script() takes the timeout as a pointer and the caller decides
whether it wants one. However, both stop: and reload: scripts so far
have no timeout, i.e., NULL. Guard the branch that reads a leading
number.
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
3 files changed
+40
-1
No files matched your search
+2
-1
@@ -1656,7 +1656,8 @@ static void parse_script(svc_t *svc, char *type, char *script, int *tmo, char *b
|
|||||||
script, errstr);
|
script, errstr);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
*tmo = (int)(sec * 1000);
|
if (tmo)
|
||||||
|
*tmo = (int)(sec * 1000);
|
||||||
} else {
|
} else {
|
||||||
path = script;
|
path = script;
|
||||||
if (tmo)
|
if (tmo)
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ EXTRA_DIST += bootstrap-crash.sh
|
|||||||
EXTRA_DIST += cond-start-task.sh
|
EXTRA_DIST += cond-start-task.sh
|
||||||
EXTRA_DIST += conf-format.sh
|
EXTRA_DIST += conf-format.sh
|
||||||
EXTRA_DIST += conf-template.sh
|
EXTRA_DIST += conf-template.sh
|
||||||
|
EXTRA_DIST += script-timeout.sh
|
||||||
EXTRA_DIST += crashing.sh
|
EXTRA_DIST += crashing.sh
|
||||||
EXTRA_DIST += dep-chain-reload.sh
|
EXTRA_DIST += dep-chain-reload.sh
|
||||||
EXTRA_DIST += depserv.sh
|
EXTRA_DIST += depserv.sh
|
||||||
@@ -79,6 +80,7 @@ TESTS += bootstrap-crash.sh
|
|||||||
TESTS += cond-start-task.sh
|
TESTS += cond-start-task.sh
|
||||||
TESTS += conf-format.sh
|
TESTS += conf-format.sh
|
||||||
TESTS += conf-template.sh
|
TESTS += conf-template.sh
|
||||||
|
TESTS += script-timeout.sh
|
||||||
TESTS += crashing.sh
|
TESTS += crashing.sh
|
||||||
TESTS += dep-chain-reload.sh
|
TESTS += dep-chain-reload.sh
|
||||||
TESTS += depserv.sh
|
TESTS += depserv.sh
|
||||||
|
|||||||
Executable
+36
@@ -0,0 +1,36 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# A timeout on a stop: or reload: script must not take PID 1 with it.
|
||||||
|
# Those two hooks passed a NULL timeout pointer to parse_script(),
|
||||||
|
# which wrote through it whenever the script was prefixed with a
|
||||||
|
# valid number. Only a valid number reached the store, so
|
||||||
|
# 'stop:abc,/bin/true' was harmless while 'stop:5,/bin/true' was not.
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
TEST_DIR=$(dirname "$0")
|
||||||
|
|
||||||
|
test_teardown()
|
||||||
|
{
|
||||||
|
say "Running test teardown."
|
||||||
|
run "rm -f $FINIT_CONF"
|
||||||
|
}
|
||||||
|
|
||||||
|
# shellcheck source=/dev/null
|
||||||
|
. "$TEST_DIR/lib/setup.sh"
|
||||||
|
|
||||||
|
# shellcheck disable=SC2154
|
||||||
|
assert_alive()
|
||||||
|
{
|
||||||
|
assert "Finit survived $1" "$(kill -0 "$finit_pid" 2>/dev/null && echo yes)" = "yes"
|
||||||
|
}
|
||||||
|
|
||||||
|
for hook in stop reload post pre; do
|
||||||
|
say "Timeout on a $hook: script"
|
||||||
|
run "echo 'service $hook:5,/bin/true service.sh -- Timeout test' > $FINIT_CONF"
|
||||||
|
run "initctl reload" || true
|
||||||
|
assert_alive "$hook:5,/bin/true"
|
||||||
|
done
|
||||||
|
|
||||||
|
say 'The service still runs afterwards'
|
||||||
|
run "echo 'service stop:5,/bin/true service.sh -- Timeout test' > $FINIT_CONF"
|
||||||
|
run "initctl reload"
|
||||||
|
retry 'assert_num_children 1 service.sh'
|
||||||
Reference in new issue
Block a user