about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLeah Neukirchen <leah@vuxu.org>2024-01-23 21:46:13 +0100
committerLeah Neukirchen <leah@vuxu.org>2024-01-23 21:46:13 +0100
commit2a0a90050c288dc617d71e79e0de203bf11cfc36 (patch)
treecf27ad44389345bdc169269da0a16593cfa43c98
parentc3c8ed82b862db29b782fac8b9c412a54c1e1589 (diff)
downloadnitro-2a0a90050c288dc617d71e79e0de203bf11cfc36.tar.gz
nitro-2a0a90050c288dc617d71e79e0de203bf11cfc36.tar.xz
nitro-2a0a90050c288dc617d71e79e0de203bf11cfc36.zip
delay spawning on fork fails
Tested using sudo -u nobody NITRO_SOCK=... chpst -p 7 ...
-rw-r--r--nitro.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/nitro.c b/nitro.c
index 752288b..935818d 100644
--- a/nitro.c
+++ b/nitro.c
@@ -336,7 +336,13 @@ proc_launch(int i)
 		write(alivepipefd[1], &status, 1);
 		_exit(status);
 	} else if (child < 0) {
-		abort();        /* XXX handle retry */
+		/* fork failed, delay */
+		close(alivepipefd[0]);
+		close(alivepipefd[1]);
+		services[i].state = PROC_DELAY;
+		services[i].timeout = 2000;
+		services[i].deadline = 0;
+		return;
 	}
 
 	close(alivepipefd[1]);
@@ -403,7 +409,11 @@ proc_setup(int i)
 			execle("setup", "setup", (char *)0, child_environ);
 		_exit(127);
 	} else if (child < 0) {
-		abort();        /* XXX handle retry */
+		/* fork failed, delay */
+		services[i].state = PROC_DELAY;
+		services[i].timeout = 2000;
+		services[i].deadline = 0;
+		return;
 	}
 
 	// XXX use alivepipe?
@@ -472,7 +482,9 @@ proc_finish(int i)
 			execle("finish", "finish", run_status, run_signal, (char *)0, child_environ);
 		_exit(127);
 	} else if (child < 0) {
-		abort();        /* XXX handle retry */
+		/* fork failed, skip over the finish script */
+		process_step(i, EVNT_FINISHED);
+		return;
 	}
 
 	services[i].finishpid = child;