Use PR_SET_PDEATHSIG to ensure child cleanup
This commit is contained in:
		
							parent
							
								
									163fdf292e
								
							
						
					
					
						commit
						809ca33806
					
				
					 3 changed files with 13 additions and 3 deletions
				
			
		|  | @ -19,6 +19,10 @@ | ||||||
| #include <sys/syscall.h> | #include <sys/syscall.h> | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  | #ifdef __linux__ | ||||||
|  | #include <sys/prctl.h> | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| extern char * * environ; | extern char * * environ; | ||||||
| 
 | 
 | ||||||
|  | @ -847,7 +851,8 @@ void killUser(uid_t uid) | ||||||
| //////////////////////////////////////////////////////////////////////
 | //////////////////////////////////////////////////////////////////////
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| pid_t startProcess(std::function<void()> fun, const string & errorPrefix) | pid_t startProcess(std::function<void()> fun, | ||||||
|  |     bool dieWithParent, const string & errorPrefix) | ||||||
| { | { | ||||||
|     pid_t pid = fork(); |     pid_t pid = fork(); | ||||||
|     if (pid == -1) throw SysError("unable to fork"); |     if (pid == -1) throw SysError("unable to fork"); | ||||||
|  | @ -855,6 +860,10 @@ pid_t startProcess(std::function<void()> fun, const string & errorPrefix) | ||||||
|     if (pid == 0) { |     if (pid == 0) { | ||||||
|         _writeToStderr = 0; |         _writeToStderr = 0; | ||||||
|         try { |         try { | ||||||
|  | #if __linux__ | ||||||
|  |             if (dieWithParent && prctl(PR_SET_PDEATHSIG, SIGKILL) == -1) | ||||||
|  |                 throw SysError("setting death signal"); | ||||||
|  | #endif | ||||||
|             restoreAffinity(); |             restoreAffinity(); | ||||||
|             fun(); |             fun(); | ||||||
|         } catch (std::exception & e) { |         } catch (std::exception & e) { | ||||||
|  |  | ||||||
|  | @ -267,7 +267,8 @@ void killUser(uid_t uid); | ||||||
| 
 | 
 | ||||||
| /* Fork a process that runs the given function, and return the child
 | /* Fork a process that runs the given function, and return the child
 | ||||||
|    pid to the caller. */ |    pid to the caller. */ | ||||||
| pid_t startProcess(std::function<void()> fun, const string & errorPrefix = "error: "); | pid_t startProcess(std::function<void()> fun, bool dieWithParent = true, | ||||||
|  |     const string & errorPrefix = "error: "); | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /* Run a program and return its stdout in a string (i.e., like the
 | /* Run a program and return its stdout in a string (i.e., like the
 | ||||||
|  |  | ||||||
|  | @ -779,7 +779,7 @@ static void daemonLoop(char * * argv) | ||||||
|                 processConnection(trusted); |                 processConnection(trusted); | ||||||
| 
 | 
 | ||||||
|                 _exit(0); |                 _exit(0); | ||||||
|             }, "unexpected Nix daemon error: "); |             }, false, "unexpected Nix daemon error: "); | ||||||
| 
 | 
 | ||||||
|         } catch (Interrupted & e) { |         } catch (Interrupted & e) { | ||||||
|             throw; |             throw; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue