mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-11-07 07:26:13 -05:00
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>
This commit is contained in:
parent
00ef6c18d5
commit
bb0beaecde
1 changed files with 5 additions and 4 deletions
|
@ -2,6 +2,7 @@
|
||||||
#include "misc.hh"
|
#include "misc.hh"
|
||||||
#include "local-store.hh"
|
#include "local-store.hh"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <queue>
|
#include <queue>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
@ -226,10 +227,10 @@ static void readTempRoots(PathSet & tempRoots, FDs & fds)
|
||||||
//FDPtr fd(new AutoCloseFD(openLockFile(path, false)));
|
//FDPtr fd(new AutoCloseFD(openLockFile(path, false)));
|
||||||
//if (*fd == -1) continue;
|
//if (*fd == -1) continue;
|
||||||
|
|
||||||
/* Try to acquire a write lock without blocking. This can
|
/* Try to acquire a write lock without blocking. This can only
|
||||||
only succeed if the owning process has died. In that case
|
succeed if the owning process has died, in which case we don't care
|
||||||
we don't care about its temporary roots. */
|
about its temporary roots, or if we are the owning process. */
|
||||||
if (lockFile(*fd, ltWrite, false)) {
|
if (i.name != std::to_string(getpid()) && lockFile(*fd, ltWrite, false)) {
|
||||||
printMsg(lvlError, format("removing stale temporary roots file `%1%'") % path);
|
printMsg(lvlError, format("removing stale temporary roots file `%1%'") % path);
|
||||||
unlink(path.c_str());
|
unlink(path.c_str());
|
||||||
writeFull(*fd, "d");
|
writeFull(*fd, "d");
|
||||||
|
|
Loading…
Reference in a new issue