From c3286ec020dfa20edcad6ad3cea519546e5207f1 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Thu, 7 Dec 2006 17:52:58 +0000 Subject: [PATCH] * Don't count on the Pid deconstructor to kill the child process, since if we're running a build user in non-root mode, we can't. Let the setuid helper do it. --- src/libstore/build.cc | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/libstore/build.cc b/src/libstore/build.cc index 03a708b74..184b05c86 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -653,12 +653,24 @@ DerivationGoal::DerivationGoal(const Path & drvPath, Worker & worker) DerivationGoal::~DerivationGoal() { - if (pid != -1) worker.childTerminated(pid); - /* Careful: we should never ever throw an exception from a destructor. */ try { + if (pid != -1) { + worker.childTerminated(pid); + + if (buildUser.enabled()) { + /* Can't let pid's destructor do it, since it may not + have the appropriate privilege (i.e., the setuid + helper should do it). */ + buildUser.kill(); + pid.wait(true); + assert(pid == -1); + } + } + deleteTmpDir(false); + } catch (Error & e) { printMsg(lvlError, format("error (ignored): %1%") % e.msg()); }