From 207263a61e54a413d02c52f08d7771dd082d20f1 Mon Sep 17 00:00:00 2001 From: "Barton E. Schaefer" Date: Sun, 2 Apr 2017 14:43:27 -0700 Subject: 40929 (replaces 40598): paramsubst() should always return scalar when PREFORK_SINGLE was passed in from prefork() Previous commit (74fe4d09) consumed too much of the input linked list, leading to later expansions being skipped. This commit converts from array to string sooner, but may thereby alter rc_expand_param and array element uniqueness behavior. --- Src/subst.c | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) (limited to 'Src') diff --git a/Src/subst.c b/Src/subst.c index e639c96a8..5b1bf8988 100644 --- a/Src/subst.c +++ b/Src/subst.c @@ -446,7 +446,7 @@ singsub(char **s) * NULL to use IFS). The return value is true iff the expansion resulted * in an empty list. * - * *ms_flags is set to bits in the enum above as neeed. + * *ms_flags is set to bits in the enum above as needed. */ /**/ @@ -3779,6 +3779,13 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int pf_flags, * as a scalar.) */ + if (isarr && ssub) { + /* prefork() wants a scalar, so join no matter what else */ + val = sepjoin(aval, NULL, 1); + isarr = 0; + l->list.flags &= ~LF_ARRAY; + } + /* * If a multsub result had whitespace at the start and we're * splitting and there's a previous string, now's the time to do so. @@ -4026,18 +4033,6 @@ 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); -- cgit 1.4.1