From 3bf8cab82e32fc6903be995a5b6d7276307b22fe Mon Sep 17 00:00:00 2001
From: Peter Stephenson
Date: Wed, 15 Apr 2015 21:16:17 +0100
Subject: 34900: assignment before an "exec".
Without POSXIBUILTIN: restore after, so we only get side effects.
With POSXIBUILTIN: keep set variable
---
ChangeLog | 5 +++++
Src/exec.c | 21 ++++++++++++++-------
2 files changed, 19 insertions(+), 7 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 0d4521453..e41d8b893 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2015-04-15 Peter Stephenson
+
+ * 34900: Src/exec.c: assignment before an "exec" with
+ a redirection, with and without POSIXBUILTINS.
+
2015-04-15 Peter Stephenson
* unposted: Src/math.c: rewrite last commit to look more
diff --git a/Src/exec.c b/Src/exec.c
index 2ee37d09f..2a8185cbc 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -3305,6 +3305,20 @@ execcmd(Estate state, int input, int output, int how, int last1)
closemn(mfds, i, REDIR_CLOSE);
if (nullexec) {
+ /*
+ * If nullexec is 2, we have variables to add with the redirections
+ * in place. If nullexec is 1, we may have variables but they
+ * need the standard restore logic.
+ */
+ if (varspc) {
+ LinkList restorelist = 0, removelist = 0;
+ if (!isset(POSIXBUILTINS) && nullexec != 2)
+ save_params(state, varspc, &restorelist, &removelist);
+ addvars(state, varspc, 0);
+ if (restorelist)
+ restore_params(restorelist, removelist);
+ }
+ lastval = errflag ? errflag : cmdoutval;
if (nullexec == 1) {
/*
* If nullexec is 1 we specifically *don't* restore the original
@@ -3315,13 +3329,6 @@ execcmd(Estate state, int input, int output, int how, int last1)
zclose(save[i]);
goto done;
}
- /*
- * If nullexec is 2, we have variables to add with the redirections
- * in place.
- */
- if (varspc)
- addvars(state, varspc, 0);
- lastval = errflag ? errflag : cmdoutval;
if (isset(XTRACE)) {
fputc('\n', xtrerr);
fflush(xtrerr);
--
cgit 1.4.1