ash: expand: Fixed "$@" expansion when EXP_FULL is false
No binary (build failed)
—
(log yok)
| @@ -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': | |
| @@ -22,4 +22,20 @@ Testing: IFS="" "$*" | |
| Testing: IFS="" "$@" | |
| .abc. | |
| .d e. | |
| + | Testing: !IFS v=$* |
| + | v='abc d e' |
| + | Testing: !IFS v=$@ |
| + | v='abc d e' |
| + | Testing: !IFS v="$*" |
| + | v='abc d e' |
| + | Testing: !IFS v="$@" |
| + | v='abc d e' |
| + | Testing: IFS="" v=$* |
| + | v='abcd e' |
| + | Testing: IFS="" v=$@ |
| + | v='abcd e' |
| + | Testing: IFS="" v="$*" |
| + | v='abcd e' |
| + | Testing: IFS="" v="$@" |
| + | v='abcd e' |
| Finished | |
| @@ -18,4 +18,25 @@ IFS=""; for a in "$*"; do echo ".$a."; done | |
| echo 'Testing: IFS="" "$@"' | |
| IFS=""; for a in "$@"; do echo ".$a."; done | |
| + | echo 'Testing: !IFS v=$*' |
| + | unset IFS; v=$*; echo "v='$v'" |
| + | echo 'Testing: !IFS v=$@' |
| + | unset IFS; v=$@; echo "v='$v'" |
| + | echo 'Testing: !IFS v="$*"' |
| + | unset IFS; v="$*"; echo "v='$v'" |
| + | echo 'Testing: !IFS v="$@"' |
| + | unset IFS; v="$@"; echo "v='$v'" |
| + | |
| + | echo 'Testing: IFS="" v=$*' |
| + | IFS=""; v=$*; echo "v='$v'" |
| + | echo 'Testing: IFS="" v=$@' |
| + | IFS=""; v=$@; echo "v='$v'" |
| + | echo 'Testing: IFS="" v="$*"' |
| + | IFS=""; v="$*"; echo "v='$v'" |
| + | echo 'Testing: IFS="" v="$@"' |
| + | IFS=""; v="$@"; echo "v='$v'" |
| + | |
| + | # Note: in IFS="" v=$@ and IFS="" v="$@" cases, bash produces "abc d e" |
| + | # We produce "abcd e" |
| + | |
| echo Finished | |
| @@ -22,4 +22,20 @@ Testing: IFS="" "$*" | |
| Testing: IFS="" "$@" | |
| .abc. | |
| .d e. | |
| + | Testing: !IFS v=$* |
| + | v='abc d e' |
| + | Testing: !IFS v=$@ |
| + | v='abc d e' |
| + | Testing: !IFS v="$*" |
| + | v='abc d e' |
| + | Testing: !IFS v="$@" |
| + | v='abc d e' |
| + | Testing: IFS="" v=$* |
| + | v='abcd e' |
| + | Testing: IFS="" v=$@ |
| + | v='abcd e' |
| + | Testing: IFS="" v="$*" |
| + | v='abcd e' |
| + | Testing: IFS="" v="$@" |
| + | v='abcd e' |
| Finished | |
| @@ -18,4 +18,25 @@ IFS=""; for a in "$*"; do echo ".$a."; done | |
| echo 'Testing: IFS="" "$@"' | |
| IFS=""; for a in "$@"; do echo ".$a."; done | |
| + | echo 'Testing: !IFS v=$*' |
| + | unset IFS; v=$*; echo "v='$v'" |
| + | echo 'Testing: !IFS v=$@' |
| + | unset IFS; v=$@; echo "v='$v'" |
| + | echo 'Testing: !IFS v="$*"' |
| + | unset IFS; v="$*"; echo "v='$v'" |
| + | echo 'Testing: !IFS v="$@"' |
| + | unset IFS; v="$@"; echo "v='$v'" |
| + | |
| + | echo 'Testing: IFS="" v=$*' |
| + | IFS=""; v=$*; echo "v='$v'" |
| + | echo 'Testing: IFS="" v=$@' |
| + | IFS=""; v=$@; echo "v='$v'" |
| + | echo 'Testing: IFS="" v="$*"' |
| + | IFS=""; v="$*"; echo "v='$v'" |
| + | echo 'Testing: IFS="" v="$@"' |
| + | IFS=""; v="$@"; echo "v='$v'" |
| + | |
| + | # Note: in IFS="" v=$@ and IFS="" v="$@" cases, bash produces "abc d e" |
| + | # We produce "abcd e" |
| + | |
| echo Finished | |