ash: expand: Fix bugs with words connected to the right of $@
Upstream email: This is actually composed of two bugs. First of all our tracking of quotemark is wrong so anything after "$@" becomes quoted. Once we fix that then the problem is that the first space character after "$@" is not recognised as an IFS. This patch fixes both. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
355ec353be
commit
9a95df9046
11
shell/ash.c
11
shell/ash.c
@ -5975,7 +5975,10 @@ ifsbreakup(char *string, struct arglist *arglist)
|
|||||||
realifs = ifsset() ? ifsval() : defifs;
|
realifs = ifsset() ? ifsval() : defifs;
|
||||||
ifsp = &ifsfirst;
|
ifsp = &ifsfirst;
|
||||||
do {
|
do {
|
||||||
|
int afternul;
|
||||||
|
|
||||||
p = string + ifsp->begoff;
|
p = string + ifsp->begoff;
|
||||||
|
afternul = nulonly;
|
||||||
nulonly = ifsp->nulonly;
|
nulonly = ifsp->nulonly;
|
||||||
ifs = nulonly ? nullstr : realifs;
|
ifs = nulonly ? nullstr : realifs;
|
||||||
ifsspc = 0;
|
ifsspc = 0;
|
||||||
@ -5987,7 +5990,7 @@ ifsbreakup(char *string, struct arglist *arglist)
|
|||||||
p++;
|
p++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!nulonly)
|
if (!(afternul || nulonly))
|
||||||
ifsspc = (strchr(defifs, *p) != NULL);
|
ifsspc = (strchr(defifs, *p) != NULL);
|
||||||
/* Ignore IFS whitespace at start */
|
/* Ignore IFS whitespace at start */
|
||||||
if (q == start && ifsspc) {
|
if (q == start && ifsspc) {
|
||||||
@ -6650,12 +6653,12 @@ argstr(char *p, int flags)
|
|||||||
case CTLENDVAR: /* ??? */
|
case CTLENDVAR: /* ??? */
|
||||||
goto breakloop;
|
goto breakloop;
|
||||||
case CTLQUOTEMARK:
|
case CTLQUOTEMARK:
|
||||||
inquotes ^= EXP_QUOTED;
|
|
||||||
/* "$@" syntax adherence hack */
|
/* "$@" syntax adherence hack */
|
||||||
if (inquotes && !memcmp(p, dolatstr + 1, DOLATSTRLEN - 1)) {
|
if (!inquotes && !memcmp(p, dolatstr + 1, DOLATSTRLEN - 1)) {
|
||||||
p = evalvar(p + 1, flags | inquotes) + 1;
|
p = evalvar(p + 1, flags | EXP_QUOTED) + 1;
|
||||||
goto start;
|
goto start;
|
||||||
}
|
}
|
||||||
|
inquotes ^= EXP_QUOTED;
|
||||||
addquote:
|
addquote:
|
||||||
if (flags & QUOTES_ESC) {
|
if (flags & QUOTES_ESC) {
|
||||||
p--;
|
p--;
|
||||||
|
2
shell/ash_test/ash-parsing/starquoted3.right
Normal file
2
shell/ash_test/ash-parsing/starquoted3.right
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
<a>
|
||||||
|
<>
|
1
shell/ash_test/ash-parsing/starquoted3.tests
Executable file
1
shell/ash_test/ash-parsing/starquoted3.tests
Executable file
@ -0,0 +1 @@
|
|||||||
|
set -- a ""; space=" "; printf "<%s>\n" "$@"$space
|
2
shell/hush_test/hush-parsing/starquoted3.right
Normal file
2
shell/hush_test/hush-parsing/starquoted3.right
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
<a>
|
||||||
|
<>
|
1
shell/hush_test/hush-parsing/starquoted3.tests
Executable file
1
shell/hush_test/hush-parsing/starquoted3.tests
Executable file
@ -0,0 +1 @@
|
|||||||
|
set -- a ""; space=" "; printf "<%s>\n" "$@"$space
|
Loading…
Reference in New Issue
Block a user