sh: Do not call exitshell() from evalcommand() unless evalcommand() forked

itself.

This ensures that certain traps caused by builtins are executed.
This commit is contained in:
Jilles Tjoelker 2011-01-05 23:17:29 +00:00
parent 0fa61e2f67
commit e23a66ac83
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=217035
2 changed files with 22 additions and 4 deletions

View File

@ -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 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd)
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;

View File

@ -0,0 +1,17 @@
# $FreeBSD$
T=$(mktemp -d ${TMPDIR:-/tmp}/sh-test.XXXXXX)
trap 'rm -rf $T' 0
cd $T || exit 3
mkfifo fifo1
v=$(
exec 3>&1
: <fifo1 &
{
wait $!
trap 'trap "" PIPE; echo trapped >&3 2>/dev/null' PIPE
echo x 2>/dev/null
} >fifo1
)
test "$v" = trapped