diff options
author | Leah Neukirchen <leah@vuxu.org> | 2024-01-23 21:46:13 +0100 |
---|---|---|
committer | Leah Neukirchen <leah@vuxu.org> | 2024-01-23 21:46:13 +0100 |
commit | 2a0a90050c288dc617d71e79e0de203bf11cfc36 (patch) | |
tree | cf27ad44389345bdc169269da0a16593cfa43c98 | |
parent | c3c8ed82b862db29b782fac8b9c412a54c1e1589 (diff) | |
download | nitro-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.c | 18 |
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; |