summaryrefslogtreecommitdiff
path: root/Src/subst.c
diff options
context:
space:
mode:
authorBarton E. Schaefer <schaefer@zsh.org>2017-02-20 13:22:55 -0800
committerBarton E. Schaefer <schaefer@zsh.org>2017-02-20 13:26:49 -0800
commit74fe4d0950d5db0bba9d8ec182c4a827728cff60 (patch)
tree1595782fba72bc5767569ee421d560c90f676db5 /Src/subst.c
parent574933e5a0566581155b81009ca8ef4c25f4a3e4 (diff)
downloadzsh-74fe4d0950d5db0bba9d8ec182c4a827728cff60.tar.gz
zsh-74fe4d0950d5db0bba9d8ec182c4a827728cff60.zip
40598: paramsubst() should always return scalar when PREFORK_SINGLE was passed
Diffstat (limited to 'Src/subst.c')
-rw-r--r--Src/subst.c15
1 files changed, 14 insertions, 1 deletions
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);