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"); | ||||||
|  |  | ||||||
		Reference in a new issue