aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2018-03-26 23:55:50 +0800
committerBen Hutchings <ben@decadent.org.uk>2020-03-28 21:42:54 +0000
commita33ea92e57007317a5c406626441029899e164e0 (patch)
tree8e0e897c46d22f146ab940b18837a750325a0db9
parent4265f8d559e294cc39afce8cc6849341db751b0b (diff)
downloadklibc-a33ea92e57007317a5c406626441029899e164e0.tar.gz
[klibc] dash: eval: Reap zombies after built-in commands and functions
[ dash commit 03876c0743a50984b0aae69bba6f5034dc38aec1 ] Currently dash does not reap dead children after built-in commands or functions. This means that if you construct a loop consisting of solely built-in commands and functions, then zombies can hang around indefinitely. This patch fixes this by reaping when necessary after each built-in command and function. Reported-by: Denys Vlasenko <vda.linux@googlemail.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
-rw-r--r--usr/dash/eval.c11
-rw-r--r--usr/dash/jobs.c8
2 files changed, 11 insertions, 8 deletions
diff --git a/usr/dash/eval.c b/usr/dash/eval.c
index a679ba31c90438..260554934c5384 100644
--- a/usr/dash/eval.c
+++ b/usr/dash/eval.c
@@ -848,6 +848,8 @@ bail:
goto out;
}
+ jp = NULL;
+
/* Execute the command. */
switch (cmdentry.cmdtype) {
default:
@@ -856,7 +858,6 @@ bail:
INTOFF;
jp = makejob(cmd, 1);
if (forkshell(jp, cmd, FORK_FG) != 0) {
- status = waitforjob(jp);
INTON;
break;
}
@@ -875,22 +876,22 @@ bail:
if (evalbltin(cmdentry.u.cmd, argc, argv, flags)) {
if (exception == EXERROR && spclbltin <= 0) {
FORCEINTON;
- goto readstatus;
+ break;
}
raise:
longjmp(handler->loc, 1);
}
- goto readstatus;
+ break;
case CMDFUNCTION:
poplocalvars(1);
if (evalfun(cmdentry.u.func, argc, argv, flags))
goto raise;
-readstatus:
- status = exitstatus;
break;
}
+ status = waitforjob(jp);
+
out:
if (cmd->ncmd.redirect)
popredir(execcmd);
diff --git a/usr/dash/jobs.c b/usr/dash/jobs.c
index 333a2a2269f1bd..3ea7e12226506f 100644
--- a/usr/dash/jobs.c
+++ b/usr/dash/jobs.c
@@ -53,6 +53,7 @@
#include <termios.h>
#undef CEOF /* syntax.h redefines this */
#endif
+#include "eval.h"
#include "redir.h"
#include "show.h"
#include "main.h"
@@ -972,10 +973,11 @@ waitforjob(struct job *jp)
{
int st;
- TRACE(("waitforjob(%%%d) called\n", jobno(jp)));
- while (jp->state == JOBRUNNING) {
+ TRACE(("waitforjob(%%%d) called\n", jp ? jobno(jp) : 0));
+ while ((jp && jp->state == JOBRUNNING) || gotsigchld)
dowait(DOWAIT_BLOCK, jp);
- }
+ if (!jp)
+ return exitstatus;
st = getstatus(jp);
#if JOBS
if (jp->jobctl) {