summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--Src/exec.c17
-rw-r--r--Test/C03traps.ztst17
3 files changed, 41 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 002f608be..babd2321e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2018-07-09 Peter Stephenson <p.stephenson@samsung.com>
+
+ * users/23531: Src/exec.c, Test/C03traps.ztst: Fix error
+ exit/return from within shell construct inside nested function,
+ and in left hand side of pipe (regression due to broken tests);
+ stop tests from exiting too early and add new test for first fix.
+
2018-07-07 Matthew Martin <phy1729@gmail.com>
* 43106: Completion/BSD/Command/_ldap: Add ldap completer.
diff --git a/Src/exec.c b/Src/exec.c
index d44527841..586402070 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -2728,6 +2728,11 @@ execcmd_fork(Estate state, int how, int type, Wordcode varspc,
if (sigtrapped[SIGINT] & ZSIG_IGNORED)
holdintr();
+ /*
+ * EXIT traps shouldn't be called even if we forked to run
+ * shell code as this isn't the main shell.
+ */
+ sigtrapped[SIGEXIT] = 0;
#ifdef HAVE_NICE
/* Check if we should run background jobs at a lower priority. */
if ((how & Z_ASYNC) && isset(BGNICE))
@@ -5792,7 +5797,19 @@ doshfunc(Shfunc shfunc, LinkList doshargs, int noreturnval)
undoshfunc:
--funcdepth;
if (retflag) {
+ /*
+ * This function is forced to return.
+ */
retflag = 0;
+ /*
+ * The calling function isn't necessarily forced to return,
+ * but it should be made sensitive to ERR_EXIT and
+ * ERR_RETURN as the assumptions we made at the end of
+ * constructs within this function no longer apply. If
+ * there are cases where this is not true, they need adding
+ * to C03traps.ztst.
+ */
+ this_noerrexit = 0;
breaks = funcsave->breaks;
}
freearray(pparams);
diff --git a/Test/C03traps.ztst b/Test/C03traps.ztst
index f22962550..dce263f94 100644
--- a/Test/C03traps.ztst
+++ b/Test/C03traps.ztst
@@ -680,6 +680,22 @@ F:Must be tested with a top-level script rather than source or function
>Better
>In .zshenv
+ unsetopt errreturn
+ fn2() {
+ if true; then
+ false
+ fi
+ }
+ fn1() {
+ setopt localoptions errreturn
+ fn2
+ print $?
+ }
+ fn1
+ print fn1 done
+0:ERR_RETURN caused by function returning false from within shell construct
+>fn1 done
+
fn2() {
if false; then
print Bad
@@ -741,6 +757,7 @@ F:Must be tested with a top-level script rather than source or function
0:ERR_EXIT not triggered by status 1 at end of { }
>OK
+ unsetopt err_exit err_return
(setopt err_exit
for x in y; do
false