diff options
author | Ralf Habacker <ralf.habacker@freenet.de> | 2020-06-10 10:07:26 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2020-06-10 10:07:26 +0100 |
commit | 25065fcd192d9958c03e107985aea41d651e4a16 (patch) | |
tree | 46ae709218fed5ee1f62d95e3ac5cc84bfa2f998 /binutils/mclex.c | |
parent | cab5c3b707871395d1d1a8962c41ec05db1aeba8 (diff) | |
download | gdb-25065fcd192d9958c03e107985aea41d651e4a16.zip gdb-25065fcd192d9958c03e107985aea41d651e4a16.tar.gz gdb-25065fcd192d9958c03e107985aea41d651e4a16.tar.bz2 |
Fix the windmc program to conform to the behaviour of mc.exe by rejecting lines that reach end-of-file without a terminating newline character.
PR 26082
* mclex.c (yylex): Reject lines that reach end-of-file without a
terminating newline character.
Diffstat (limited to 'binutils/mclex.c')
-rw-r--r-- | binutils/mclex.c | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/binutils/mclex.c b/binutils/mclex.c index 1b5d5c3..da8bfb5 100644 --- a/binutils/mclex.c +++ b/binutils/mclex.c @@ -323,6 +323,21 @@ mc_token (const unichar *t, size_t len) return -1; } +/* Skip characters in input_stream_pos up to and including a newline + character. Returns non-zero if the newline was found, zero otherwise. */ + +static int +skip_until_eol (void) +{ + while (input_stream_pos[0] != 0 && input_stream_pos[0] != '\n') + ++input_stream_pos; + if (input_stream_pos[0] == 0) + return 0; + if (input_stream_pos[0] == '\n') + ++input_stream_pos; + return 1; +} + int yylex (void) { @@ -334,29 +349,28 @@ yylex (void) fatal ("Input stream not setuped.\n"); return -1; } + if (mclex_want_line) { start_token = input_stream_pos; if (input_stream_pos[0] == 0) return -1; + /* PR 26082: Reject a period followed by EOF. */ + if (input_stream_pos[0] == '.' && input_stream_pos[1] == 0) + return -1; if (input_stream_pos[0] == '.' && (input_stream_pos[1] == '\n' || (input_stream_pos[1] == '\r' && input_stream_pos[2] == '\n'))) { mclex_want_line = FALSE; - while (input_stream_pos[0] != 0 && input_stream_pos[0] != '\n') - ++input_stream_pos; - if (input_stream_pos[0] == '\n') - ++input_stream_pos; - return MCENDLINE; + return skip_until_eol () ? MCENDLINE : -1; } - while (input_stream_pos[0] != 0 && input_stream_pos[0] != '\n') - ++input_stream_pos; - if (input_stream_pos[0] == '\n') - ++input_stream_pos; + if (!skip_until_eol ()) + return -1; yylval.ustr = get_diff (input_stream_pos, start_token); return MCLINE; } + while ((ch = input_stream_pos[0]) <= 0x20) { if (ch == 0) @@ -404,10 +418,8 @@ yylex (void) { case ';': ++start_token; - while (input_stream_pos[0] != '\n' && input_stream_pos[0] != 0) - ++input_stream_pos; - if (input_stream_pos[0] == '\n') - input_stream_pos++; + if (!skip_until_eol ()) + return -1; yylval.ustr = get_diff (input_stream_pos, start_token); return MCCOMMENT; case '=': |