From: Lennart Poettering Date: Wed, 11 Jan 2012 00:51:32 +0000 (+0100) Subject: service: brutally slaughter processes that are running in the cgroup when we enter... X-Git-Tag: v38~9 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=8f53a7b8ea9ba505f8fefe4df4aaa5a8aab1e2eb service: brutally slaughter processes that are running in the cgroup when we enter START_PRE and START --- diff --git a/src/cgroup.c b/src/cgroup.c index 4bbb54fd7..9680cd6d2 100644 --- a/src/cgroup.c +++ b/src/cgroup.c @@ -197,6 +197,9 @@ int cgroup_bonding_kill_list(CGroupBonding *first, int sig, bool sigcont, Set *s Set *allocated_set = NULL; int ret = -EAGAIN, r; + if (!first) + return 0; + if (!s) if (!(s = allocated_set = set_new(trivial_hash_func, trivial_compare_func))) return -ENOMEM; diff --git a/src/service.c b/src/service.c index 0110c9f12..113be34ad 100644 --- a/src/service.c +++ b/src/service.c @@ -2021,6 +2021,11 @@ static void service_enter_start(Service *s) { else service_unwatch_main_pid(s); + /* We want to ensure that nobody leaks processes from + * START_PRE here, so let's go on a killing spree, People + * should not spawn long running processes from START_PRE. */ + cgroup_bonding_kill_list(s->meta.cgroup_bondings, SIGKILL, true, NULL); + if (s->type == SERVICE_FORKING) { s->control_command_id = SERVICE_EXEC_START; c = s->control_command = s->exec_command[SERVICE_EXEC_START]; @@ -2090,6 +2095,11 @@ static void service_enter_start_pre(Service *s) { service_unwatch_control_pid(s); if ((s->control_command = s->exec_command[SERVICE_EXEC_START_PRE])) { + + /* Before we start anything, let's clear up what might + * be left from previous runs. */ + cgroup_bonding_kill_list(s->meta.cgroup_bondings, SIGKILL, true, NULL); + s->control_command_id = SERVICE_EXEC_START_PRE; if ((r = service_spawn(s,