aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/build/local-derivation-goal.cc
diff options
context:
space:
mode:
authoreldritch horrors <pennae@lix.systems>2024-04-05 21:02:04 +0200
committereldritch horrors <pennae@lix.systems>2024-06-23 11:52:49 +0000
commit3d155fc509e19354ba3798b1cc1b9cbcdb789c85 (patch)
treedc3dd72cd77e02e1aeb25d75c6e01bdf34041b28 /src/libstore/build/local-derivation-goal.cc
parentb43a2e84c4b2fa7cb1167693652702e6dac95f53 (diff)
libutil: give Pid proper resource semantics
copy-constructing or assigning from pid_t can easily lead to duplicate Pid instances for the same process if a pid_t was used carelessly, and Pid itself was copy-constructible. both could cause surprising results such as killing processes twice (which could become very problemantic, but luckily modern systems don't reuse PIDs all that quickly), or more than one piece of the code believing it owns a process when neither do Change-Id: Ifea7445f84200b34c1a1d0acc2cdffe0f01e20c6
Diffstat (limited to 'src/libstore/build/local-derivation-goal.cc')
-rw-r--r--src/libstore/build/local-derivation-goal.cc10
1 files changed, 5 insertions, 5 deletions
diff --git a/src/libstore/build/local-derivation-goal.cc b/src/libstore/build/local-derivation-goal.cc
index eb6229c56..a2ff495bf 100644
--- a/src/libstore/build/local-derivation-goal.cc
+++ b/src/libstore/build/local-derivation-goal.cc
@@ -906,7 +906,7 @@ void LocalDerivationGoal::startBuilder()
Pipe sendPid;
sendPid.create();
- Pid helper = startProcess([&]() {
+ Pid helper{startProcess([&]() {
sendPid.readSide.close();
/* We need to open the slave early, before
@@ -934,7 +934,7 @@ void LocalDerivationGoal::startBuilder()
writeFull(sendPid.writeSide.get(), fmt("%d\n", child));
_exit(0);
- });
+ })};
sendPid.writeSide.close();
@@ -951,7 +951,7 @@ void LocalDerivationGoal::startBuilder()
auto ss = tokenizeString<std::vector<std::string>>(readLine(sendPid.readSide.get()));
assert(ss.size() == 1);
- pid = string2Int<pid_t>(ss[0]).value();
+ pid = Pid{string2Int<pid_t>(ss[0]).value()};
if (usingUserNamespace) {
/* Set the UID/GID mapping of the builder's user namespace
@@ -1010,10 +1010,10 @@ void LocalDerivationGoal::startBuilder()
} else
#endif
{
- pid = startProcess([&]() {
+ pid = Pid{startProcess([&]() {
openSlave();
runChild();
- });
+ })};
}
/* parent */