aboutsummaryrefslogtreecommitdiff
path: root/bin/sh/eval.c
diff options
context:
space:
mode:
authorJilles Tjoelker <jilles@FreeBSD.org>2011-01-05 23:17:29 +0000
committerJilles Tjoelker <jilles@FreeBSD.org>2011-01-05 23:17:29 +0000
commite23a66ac835bdb5e81eb350b8abb462b19ff7db2 (patch)
treec31c4798788fff31d24a5179f734842633dc90a8 /bin/sh/eval.c
parent0fa61e2f67265d89182a2748011eb37d77ff762a (diff)
downloadsrc-e23a66ac835bdb5e81eb350b8abb462b19ff7db2.tar.gz
src-e23a66ac835bdb5e81eb350b8abb462b19ff7db2.zip
sh: Do not call exitshell() from evalcommand() unless evalcommand() forked
itself. This ensures that certain traps caused by builtins are executed.
Notes
Notes: svn path=/head/; revision=217035
Diffstat (limited to 'bin/sh/eval.c')
-rw-r--r--bin/sh/eval.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/bin/sh/eval.c b/bin/sh/eval.c
index 14dd15f75cd0..0bb5322ebe93 100644
--- a/bin/sh/eval.c
+++ b/bin/sh/eval.c
@@ -671,6 +671,7 @@ safe_builtin(int idx, int argc, char **argv)
/*
* Execute a simple command.
+ * Note: This may or may not return if (flags & EV_EXIT).
*/
static void
@@ -707,6 +708,7 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd)
arglist.lastp = &arglist.list;
varlist.lastp = &varlist.list;
varflag = 1;
+ jp = NULL;
do_clearcmdentry = 0;
oexitstatus = exitstatus;
exitstatus = 0;
@@ -965,7 +967,7 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd)
evalskip = 0;
skipcount = 0;
}
- if (flags & EV_EXIT)
+ if (jp)
exitshell(exitstatus);
} else if (cmdentry.cmdtype == CMDBUILTIN) {
#ifdef DEBUG
@@ -1013,13 +1015,12 @@ cmddone:
out1 = &output;
out2 = &errout;
freestdout();
+ handler = savehandler;
if (e != EXSHELLPROC) {
commandname = savecmdname;
- if (flags & EV_EXIT) {
+ if (jp)
exitshell(exitstatus);
- }
}
- handler = savehandler;
if (flags == EV_BACKCMD) {
backcmd->buf = memout.buf;
backcmd->nleft = memout.nextc - memout.buf;