From bb0beaecdee1a2315a1269b1746d238c8ab0e699 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Fri, 7 Oct 2022 16:51:06 -0400 Subject: [PATCH] nix: Guard against removing temporary roots of living processes. Fixes . * nix/libstore/gc.cc (readTempRoots): Add a check to guard against removing the temporary roots of a living process. Signed-off-by: Maxim Cournoyer --- nix/libstore/gc.cc | 9 +++++---- 1 file 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 #include #include #include @@ -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");