diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | Src/subst.c | 15 |
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); |