summaryrefslogtreecommitdiff
path: root/shell/ash.c
diff options
context:
space:
mode:
authorDenys Vlasenko2016-10-02 02:46:56 +0200
committerDenys Vlasenko2016-10-02 02:46:56 +0200
commit0aaaa50b4551ab5912ccd95d66d633844eac6d85 (patch)
tree1a1f9e34c690051a678fb048064e4e98cca3536b /shell/ash.c
parent42eeb255c1c5f35373d3e7bfa892e4f864cf1266 (diff)
downloadbusybox-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.c28
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':