diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2018-03-26 23:55:50 +0800 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2018-04-19 18:19:29 +0800 |
commit | 03876c0743a50984b0aae69bba6f5034dc38aec1 (patch) | |
tree | 8488052cd3faab7cfaff959574702ab5b0226fd1 /src/eval.c | |
parent | redir: Fix typo in noclobber code (diff) | |
download | dash-03876c0743a50984b0aae69bba6f5034dc38aec1.tar.gz dash-03876c0743a50984b0aae69bba6f5034dc38aec1.zip |
eval: Reap zombies after built-in commands and functions
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>
Diffstat (limited to '')
-rw-r--r-- | src/eval.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/src/eval.c b/src/eval.c index 7498f9d..19e06ec 100644 --- a/src/eval.c +++ b/src/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); |