summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--Src/exec.c8
2 files changed, 10 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 3b67eba9c..0dcb8e9d7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2015-12-25 Barton E. Schaefer <schaefer@zsh.org>
+
+ * 37434: Src/exec.c: POSIXBUILTINS "command" should prevent shell
+ exit on errors from special builtins
+
2015-12-23 Philip Sequeira <phsequei@gmail.com>
* 37345: Functions/VCS_Info/VCS_INFO_maxexports,
diff --git a/Src/exec.c b/Src/exec.c
index acc867c77..f14fc27a6 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -3475,10 +3475,10 @@ execcmd(Estate state, int input, int output, int how, int last1)
restore_queue_signals(q);
} else if (is_builtin || is_shfunc) {
LinkList restorelist = 0, removelist = 0;
+ int do_save = 0;
/* builtin or shell function */
- if (!forked && varspc) {
- int do_save = 0;
+ if (!forked) {
if (isset(POSIXBUILTINS)) {
/*
* If it's a function or special builtin --- save
@@ -3497,7 +3497,7 @@ execcmd(Estate state, int input, int output, int how, int last1)
if ((cflags & BINF_COMMAND) || !assign)
do_save = 1;
}
- if (do_save)
+ if (do_save && varspc)
save_params(state, varspc, &restorelist, &removelist);
}
if (varspc) {
@@ -3643,6 +3643,8 @@ execcmd(Estate state, int input, int output, int how, int last1)
}
dont_queue_signals();
lastval = execbuiltin(args, assigns, (Builtin) hn);
+ if (do_save & BINF_COMMAND)
+ errflag &= ~ERRFLAG_ERROR;
restore_queue_signals(q);
fflush(stdout);
if (save[1] == -2) {