diff options
author | Denys Vlasenko | 2016-10-02 02:46:56 +0200 |
---|---|---|
committer | Denys Vlasenko | 2016-10-02 02:46:56 +0200 |
commit | 0aaaa50b4551ab5912ccd95d66d633844eac6d85 (patch) | |
tree | 1a1f9e34c690051a678fb048064e4e98cca3536b /shell/ash.c | |
parent | 42eeb255c1c5f35373d3e7bfa892e4f864cf1266 (diff) | |
download | busybox-0aaaa50b4551ab5912ccd95d66d633844eac6d85.zip busybox-0aaaa50b4551ab5912ccd95d66d633844eac6d85.tar.gz |
ash: expand: Fixed "$@" expansion when EXP_FULL is false
Upstream commit:
Date: Thu, 1 Jan 2015 07:53:10 +1100
expand: Fixed "$@" expansion when EXP_FULL is false
The commit 3c06acdac0b1ba0e0acdda513a57ee6e31385dce ([EXPAND]
Split unquoted $@/$* correctly when IFS is set but empty) broke
the case where $@ is in quotes and EXP_FULL is false.
In that case we should still emit IFS as field splitting is not
performed.
Reported-by: Juergen Daubert <jue@jue.li>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell/ash.c')
-rw-r--r-- | shell/ash.c | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/shell/ash.c b/shell/ash.c index 731c4b2..4f6ba0c 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -6615,7 +6615,10 @@ varvalue(char *name, int varflags, int flags, struct strlist *var_str_list, int int subtype = varflags & VSTYPE; int discard = subtype == VSPLUS || subtype == VSLENGTH; int quotes = (discard ? 0 : (flags & QUOTES_ESC)) | QUOTES_KEEPNUL; - int syntax = quoted ? DQSYNTAX : BASESYNTAX; + int syntax; + + sep = (flags & EXP_FULL) << CHAR_BIT; + syntax = quoted ? DQSYNTAX : BASESYNTAX; switch (*name) { case '$': @@ -6649,23 +6652,18 @@ varvalue(char *name, int varflags, int flags, struct strlist *var_str_list, int raise_error_syntax("bad substitution"); #endif break; - case '@': { + case '@': + if (quoted && sep) + goto param; + /* fall through */ + case '*': { char **ap; char sepc; - sep = 0; - if (quoted && (flags & EXP_FULL)) { - /* note: this is not meant as PEOF value */ - sep = 1 << CHAR_BIT; - goto param; - } - /* fall through */ - case '*': - sep = ifsset() ? (unsigned char)(ifsval()[0]) : ' '; - if (!quoted) { + if (quoted) + sep = 0; + sep |= ifsset() ? ifsval()[0] : ' '; param: - sep |= (flags & EXP_FULL) << CHAR_BIT; - } sepc = sep; *quotedp = !sepc; ap = shellparam.p; @@ -6680,7 +6678,7 @@ varvalue(char *name, int varflags, int flags, struct strlist *var_str_list, int } } break; - } /* case '@' and '*' */ + } /* case '*' */ case '0': case '1': case '2': |