ash: parser: Fix incorrect eating of backslash newlines
Keeping up with upstream (in our case, 'before patch' code is not buggy). Upstream commit: Date: Fri, 11 May 2018 23:41:25 +0800 parser: Fix incorrect eating of backslash newlines With the introduction of synstack->syntax, a number of references to the syntax variable was missed during the conversion. This causes backslash newlines to be incorrectly removed in single quote context. This patch also combines these calls into a new helper function pgetc_top. Fixes: ab1cecb40478 ("parser: Add syntax stack for recursive...") Reported-by: Leah Neukirchen <leah@vuxu.org> 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
acf79f9913
commit
f7eea8c235
10
shell/ash.c
10
shell/ash.c
@ -10829,6 +10829,12 @@ struct synstack {
|
|||||||
struct synstack *next;
|
struct synstack *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int
|
||||||
|
pgetc_top(struct synstack *stack)
|
||||||
|
{
|
||||||
|
return stack->syntax == SQSYNTAX ? pgetc() : pgetc_eatbnl();
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
synstack_push(struct synstack **stack, struct synstack *next, int syntax)
|
synstack_push(struct synstack **stack, struct synstack *next, int syntax)
|
||||||
{
|
{
|
||||||
@ -12194,7 +12200,7 @@ readtoken1(int c, int syntax, char *eofmark, int striptabs)
|
|||||||
}
|
}
|
||||||
USTPUTC(c, out);
|
USTPUTC(c, out);
|
||||||
nlprompt();
|
nlprompt();
|
||||||
c = synstack->syntax == SQSYNTAX ? pgetc() : pgetc_eatbnl();
|
c = pgetc_top(synstack);
|
||||||
goto loop; /* continue outer loop */
|
goto loop; /* continue outer loop */
|
||||||
case CWORD:
|
case CWORD:
|
||||||
USTPUTC(c, out);
|
USTPUTC(c, out);
|
||||||
@ -12345,7 +12351,7 @@ readtoken1(int c, int syntax, char *eofmark, int striptabs)
|
|||||||
IF_ASH_ALIAS(if (c != PEOA))
|
IF_ASH_ALIAS(if (c != PEOA))
|
||||||
USTPUTC(c, out);
|
USTPUTC(c, out);
|
||||||
}
|
}
|
||||||
c = synstack->syntax == SQSYNTAX ? pgetc() : pgetc_eatbnl();
|
c = pgetc_top(synstack);
|
||||||
} /* for (;;) */
|
} /* for (;;) */
|
||||||
endword:
|
endword:
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user