summary refs log tree commit diff
path: root/src/eval.c
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2018-03-26 23:55:50 +0800
committerHerbert Xu <herbert@gondor.apana.org.au>2018-04-19 18:19:29 +0800
commit03876c0743a50984b0aae69bba6f5034dc38aec1 (patch)
tree8488052cd3faab7cfaff959574702ab5b0226fd1 /src/eval.c
parentredir: Fix typo in noclobber code (diff)
downloaddash-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 'src/eval.c')
-rw-r--r--src/eval.c11
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);