diff options
author | Ludovic Courtès <ludo@gnu.org> | 2022-10-07 16:51:06 -0400 |
---|---|---|
committer | Maxim Cournoyer <maxim.cournoyer@gmail.com> | 2022-10-07 16:54:20 -0400 |
commit | bb0beaecdee1a2315a1269b1746d238c8ab0e699 (patch) | |
tree | 0802f5eded41b618dbc13fa31ae9cb843d1085b0 | |
parent | 00ef6c18d5c6b22874221e9be74f3ba0641c0034 (diff) | |
download | guix-bb0beaecdee1a2315a1269b1746d238c8ab0e699.tar.gz guix-bb0beaecdee1a2315a1269b1746d238c8ab0e699.zip |
nix: Guard against removing temporary roots of living processes.
Fixes <https://issues.guix.gnu.org/25018>.
* nix/libstore/gc.cc (readTempRoots): Add a check to guard against removing
the temporary roots of a living process.
Signed-off-by: Maxim Cournoyer <maxim.cournoyer@gmail.com>
-rw-r--r-- | nix/libstore/gc.cc | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/nix/libstore/gc.cc b/nix/libstore/gc.cc index 16519116e4..f101de92d6 100644 --- a/nix/libstore/gc.cc +++ b/nix/libstore/gc.cc @@ -2,6 +2,7 @@ #include "misc.hh" #include "local-store.hh" +#include <string> #include <functional> #include <queue> #include <algorithm> @@ -226,10 +227,10 @@ static void readTempRoots(PathSet & tempRoots, FDs & fds) //FDPtr fd(new AutoCloseFD(openLockFile(path, false))); //if (*fd == -1) continue; - /* Try to acquire a write lock without blocking. This can - only succeed if the owning process has died. In that case - we don't care about its temporary roots. */ - if (lockFile(*fd, ltWrite, false)) { + /* Try to acquire a write lock without blocking. This can only + succeed if the owning process has died, in which case we don't care + about its temporary roots, or if we are the owning process. */ + if (i.name != std::to_string(getpid()) && lockFile(*fd, ltWrite, false)) { printMsg(lvlError, format("removing stale temporary roots file `%1%'") % path); unlink(path.c_str()); writeFull(*fd, "d"); |