1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-07-08 15:51:34 +02:00

40598: paramsubst() should always return scalar when PREFORK_SINGLE was passed

This commit is contained in:
Barton E. Schaefer 2017-02-20 13:22:55 -08:00
parent 574933e5a0
commit 74fe4d0950
2 changed files with 18 additions and 2 deletions

View file

@ -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

View file

@ -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);