Applied, thank you!
On Thu, May 2, 2024 at 2:14 PM Ron Yorston <r...@pobox.com> wrote: > > An alias expansion immediately followed by '<' and a newline is > parsed incorrectly: > > ~ $ alias x='echo yo' > ~ $ x< > yo > ~ $ > sh: syntax error: unexpected newline > > The echo is executed and an error is printed on the next command > submission. In dash the echo isn't executed and the error is > reported immediately: > > $ alias x='echo yo' > $ x< > dash: 3: Syntax error: newline unexpected > $ > > The difference between BusyBox and dash is that BusyBox supports > bash-style process substitution and output redirection. These > require checking for '<(', '>(' and '&>' in readtoken1(). > > In the case above, when the end of the alias is found, the '<' and > the following newline are both read to check for '<('. Since > there's no match both characters are pushed back. > > The next input is obtained by reading the expansion of the alias. > Once this string is exhausted the next call to __pgetc() calls > preadbuffer() which pops the string, reverts to the previous input > and recursively calls __pgetc(). This request is satisified from > the pungetc buffer. But the first __pgetc() doesn't know this: > it sees the character has come from preadbuffer() so it (incorrectly) > updates the pungetc buffer. > > Resolve the issue by moving the code to pop the string and fetch > the next character up from preadbuffer() into __pgetc(). > > function old new delta > pgetc 28 589 +561 > __pgetc 607 - -607 > ------------------------------------------------------------------------------ > (add/remove: 0/1 grow/shrink: 1/0 up/down: 561/-607) Total: -46 bytes > > Signed-off-by: Ron Yorston <r...@pobox.com> > --- > shell/ash.c | 12 ++++++------ > 1 file changed, 6 insertions(+), 6 deletions(-) > > diff --git a/shell/ash.c b/shell/ash.c > index 4ca4c6c56..5df0ba625 100644 > --- a/shell/ash.c > +++ b/shell/ash.c > @@ -10934,11 +10934,6 @@ preadbuffer(void) > char *q; > int more; > > - if (unlikely(g_parsefile->strpush)) { > - popstring(); > - return __pgetc(); > - } > - > if (g_parsefile->buf == NULL) { > pgetc_debug("preadbuffer PEOF1"); > return PEOF; > @@ -11053,8 +11048,13 @@ static int __pgetc(void) > > if (--g_parsefile->left_in_line >= 0) > c = (unsigned char)*g_parsefile->next_to_pgetc++; > - else > + else { > + if (unlikely(g_parsefile->strpush)) { > + popstring(); > + return __pgetc(); > + } > c = preadbuffer(); > + } > > g_parsefile->lastc[1] = g_parsefile->lastc[0]; > g_parsefile->lastc[0] = c; > -- > 2.44.0 > > _______________________________________________ > busybox mailing list > busybox@busybox.net > http://lists.busybox.net/mailman/listinfo/busybox _______________________________________________ busybox mailing list busybox@busybox.net http://lists.busybox.net/mailman/listinfo/busybox