Fix the windmc program to conform to the behaviour of mc.exe by rejecting lines that...
authorRalf Habacker <ralf.habacker@freenet.de>
Wed, 10 Jun 2020 09:07:26 +0000 (10:07 +0100)
committerNick Clifton <nickc@redhat.com>
Wed, 10 Jun 2020 09:07:26 +0000 (10:07 +0100)
PR 26082
* mclex.c (yylex): Reject lines that reach end-of-file without a
terminating newline character.

binutils/ChangeLog
binutils/mclex.c

index ec5b2ef2b7c91b01cff4e0fb1a14984756ea7455..43eabaa04412aedaba50b7d738b00179cdb9a6a2 100644 (file)
@@ -1,3 +1,9 @@
+2020-06-10  Ralf Habacker  <ralf.habacker@freenet.de>
+
+       PR 26082
+       * mclex.c (yylex): Reject lines that reach end-of-file without a
+       terminating newline character.
+
 2020-06-08  Nick Clifton  <nickc@redhat.com>
 
        PR 26093
index 1b5d5c374f34251f76c99aae5b2365924e715958..da8bfb513112679949f055c4dbca66b4ace3ebd4 100644 (file)
@@ -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 '=':