summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--Src/subst.c15
2 files changed, 18 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 0d3352a8e..60a5164d6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,7 @@
-2017-02-20 Barton E. Schaefer <schaefer@brasslantern.com>
+2017-02-20 Barton E. Schaefer <schaefer@zsh.org>
+
+ * 40598: Src/subst.c: paramsubst() should always return scalar
+ when PREFORK_SINGLE was passed in from prefork()
* Martijn Dekker: 40565 (tweaked): test cases for assigning array
to scalar with various combinations of SHWORDSPLIT and IFS
diff --git a/Src/subst.c b/Src/subst.c
index 1c2397c05..4df53bdb7 100644
--- a/Src/subst.c
+++ b/Src/subst.c
@@ -3475,7 +3475,6 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags,
if (nojoin == 0 || sep) {
val = sepjoin(aval, sep, 1);
isarr = 0;
- ms_flags = 0;
} else if (force_split &&
(spsep || nojoin == 2 || (!ifs && isarr < 0))) {
/* Hack to simulate splitting individual elements:
@@ -3485,6 +3484,8 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags,
val = sepjoin(aval, (nojoin == 1 ? NULL : spsep), 1);
isarr = 0;
}
+ if (!isarr)
+ ms_flags = 0;
}
if (force_split && !isarr) {
aval = sepsplit(val, spsep, 0, 1);
@@ -4007,6 +4008,18 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags,
y = dupstring(nulstring);
setdata(n, (void *) y);
}
+ if (isarr && ssub) {
+ /* prefork() wants a scalar, so join no matter what else */
+ LinkNode tn;
+
+ aval = hlinklist2array(l, 0);
+ val = sepjoin(aval, NULL, 1);
+ n = firstnode(l);
+ for (tn = lastnode(l); tn && tn != n; tn = lastnode(l))
+ uremnode(l, tn);
+ setdata(n, (void *) val);
+ l->list.flags &= ~LF_ARRAY;
+ }
if (eval)
*str = (char *) getdata(n);