From 809ca33806d75eeabb9c668b124762fb6462e5bc Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Thu, 21 Aug 2014 15:31:43 +0200 Subject: [PATCH] Use PR_SET_PDEATHSIG to ensure child cleanup --- src/libutil/util.cc | 11 ++++++++++- src/libutil/util.hh | 3 ++- src/nix-daemon/nix-daemon.cc | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/libutil/util.cc b/src/libutil/util.cc index 825748792..80e017a4f 100644 --- a/src/libutil/util.cc +++ b/src/libutil/util.cc @@ -19,6 +19,10 @@ #include #endif +#ifdef __linux__ +#include +#endif + extern char * * environ; @@ -847,7 +851,8 @@ void killUser(uid_t uid) ////////////////////////////////////////////////////////////////////// -pid_t startProcess(std::function fun, const string & errorPrefix) +pid_t startProcess(std::function fun, + bool dieWithParent, const string & errorPrefix) { pid_t pid = fork(); if (pid == -1) throw SysError("unable to fork"); @@ -855,6 +860,10 @@ pid_t startProcess(std::function fun, const string & errorPrefix) if (pid == 0) { _writeToStderr = 0; try { +#if __linux__ + if (dieWithParent && prctl(PR_SET_PDEATHSIG, SIGKILL) == -1) + throw SysError("setting death signal"); +#endif restoreAffinity(); fun(); } catch (std::exception & e) { diff --git a/src/libutil/util.hh b/src/libutil/util.hh index f6f5d1b3f..4f9f7422c 100644 --- a/src/libutil/util.hh +++ b/src/libutil/util.hh @@ -267,7 +267,8 @@ void killUser(uid_t uid); /* Fork a process that runs the given function, and return the child pid to the caller. */ -pid_t startProcess(std::function fun, const string & errorPrefix = "error: "); +pid_t startProcess(std::function fun, bool dieWithParent = true, + const string & errorPrefix = "error: "); /* Run a program and return its stdout in a string (i.e., like the diff --git a/src/nix-daemon/nix-daemon.cc b/src/nix-daemon/nix-daemon.cc index 6d166c427..ced356c34 100644 --- a/src/nix-daemon/nix-daemon.cc +++ b/src/nix-daemon/nix-daemon.cc @@ -779,7 +779,7 @@ static void daemonLoop(char * * argv) processConnection(trusted); _exit(0); - }, "unexpected Nix daemon error: "); + }, false, "unexpected Nix daemon error: "); } catch (Interrupted & e) { throw;