From e9eec8b5d2c106c5dd51382a155e6045c7c17c1a Mon Sep 17 00:00:00 2001 From: Franck Bui Date: Mon, 30 Nov 2020 15:26:15 +0100 Subject: [PATCH] scope: on unified, make sure to unwatch all PIDs once they've been moved to the cgroup scope Commit 428a9f6f1d0396b9eacde2b38d667cbe3f15eb55 freed u->pids which is problematic since the references to this unit in m->watch_pids were no more removed when the unit was freed. This patch makes sure to clean all this refs up before freeing u->pids by calling unit_unwatch_all_pids(). --- src/core/scope.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/core/scope.c b/src/core/scope.c index 654702ca3be..a247da206ff 100644 --- a/src/core/scope.c +++ b/src/core/scope.c @@ -375,10 +375,6 @@ static int scope_start(Unit *u) { return r; } - /* Now u->pids have been moved into the scope cgroup, it's not needed - * anymore. */ - u->pids = set_free(u->pids); - s->result = SCOPE_SUCCESS; scope_set_state(s, SCOPE_RUNNING); @@ -386,7 +382,13 @@ static int scope_start(Unit *u) { /* Set the maximum runtime timeout. */ scope_arm_timer(s, usec_add(UNIT(s)->active_enter_timestamp.monotonic, s->runtime_max_usec)); - /* Start watching the PIDs currently in the scope */ + /* On unified we use proper notifications hence we can unwatch the PIDs + * we just attached to the scope. This can also be done on legacy as + * we're going to update the list of the processes we watch with the + * PIDs currently in the scope anyway. */ + unit_unwatch_all_pids(u); + + /* Start watching the PIDs currently in the scope (legacy hierarchy only) */ (void) unit_enqueue_rewatch_pids(u); return 1; } -- 2.39.2