From: Auke Kok Date: Tue, 24 Jul 2012 22:13:11 +0000 (+0200) Subject: main: set PR_SET_CHILD_REAPER for MANAGER_USER X-Git-Tag: v188~94 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=d4447f4d955d5bfbdec6feec8e332b8c126f474a main: set PR_SET_CHILD_REAPER for MANAGER_USER Become the reaper for all children part of the user session. Tested with several forking services. --- diff --git a/src/core/main.c b/src/core/main.c index c7a7a87e7..1326b94f6 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -1500,6 +1500,15 @@ int main(int argc, char *argv[]) { } } + if (arg_running_as == MANAGER_USER) { + /* Become reaper of our children */ + r = prctl(PR_SET_CHILD_SUBREAPER, 1); + if (r < 0) + log_error("Failed to prctl(PR_SET_CHILD_SUBREAPER): %s", strerror(-r)); + if (r == -EINVAL) + log_error("Perhaps the kernel version is too old (< 3.4?)"); + } + r = manager_new(arg_running_as, &m); if (r < 0) { log_error("Failed to allocate manager object: %s", strerror(-r)); diff --git a/src/shared/missing.h b/src/shared/missing.h index e600acc0b..df3fd0e83 100644 --- a/src/shared/missing.h +++ b/src/shared/missing.h @@ -190,3 +190,7 @@ static inline pid_t gettid(void) { #ifndef PR_SET_NO_NEW_PRIVS #define PR_SET_NO_NEW_PRIVS 38 #endif + +#ifndef PR_SET_CHILD_SUBREAPER +#define PR_SET_CHILD_SUBREAPER 36 +#endif