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:
parent
574933e5a0
commit
74fe4d0950
2 changed files with 18 additions and 2 deletions
|
@ -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
|
||||
|
|
15
Src/subst.c
15
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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue