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:
Denys Vlasenko 2018-04-02 14:27:50 +02:00
parent 355ec353be
commit 9a95df9046
5 changed files with 13 additions and 4 deletions

View File

@ -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--;

View File

@ -0,0 +1,2 @@
<a>
<>

View File

@ -0,0 +1 @@
set -- a ""; space=" "; printf "<%s>\n" "$@"$space

View File

@ -0,0 +1,2 @@
<a>
<>

View File

@ -0,0 +1 @@
set -- a ""; space=" "; printf "<%s>\n" "$@"$space