diff options
author | Jilles Tjoelker <jilles@FreeBSD.org> | 2011-01-05 23:17:29 +0000 |
---|---|---|
committer | Jilles Tjoelker <jilles@FreeBSD.org> | 2011-01-05 23:17:29 +0000 |
commit | e23a66ac835bdb5e81eb350b8abb462b19ff7db2 (patch) | |
tree | c31c4798788fff31d24a5179f734842633dc90a8 /bin/sh/eval.c | |
parent | 0fa61e2f67265d89182a2748011eb37d77ff762a (diff) | |
download | src-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.c | 9 |
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; |