PR27218, memory access violation in dwarf2dbg.c
authorAlan Modra <amodra@gmail.com>
Thu, 21 Jan 2021 06:16:20 +0000 (16:46 +1030)
committerAlan Modra <amodra@gmail.com>
Thu, 21 Jan 2021 08:40:15 +0000 (19:10 +1030)
PR 27218
* dwarf2dbg.c (dwarf2_gen_line_info): Correct setting of dwarf_level.
(dwarf2_directive_filename, dwarf2_directive_loc): Likewise, and
error for negative file numbers.

gas/ChangeLog
gas/dwarf2dbg.c

index d06a018196b34fed9d379e42f3f91b5ec1d0dc86..f390bf266136bdcf82e00c2b3943b31a102d8538 100644 (file)
@@ -1,3 +1,10 @@
+2021-01-21  Alan Modra  <amodra@gmail.com>
+
+       PR 27218
+       * dwarf2dbg.c (dwarf2_gen_line_info): Correct setting of dwarf_level.
+       (dwarf2_directive_filename, dwarf2_directive_loc): Likewise, and
+       error for negative file numbers.
+
 2021-01-20  Alan Modra  <amodra@gmail.com>
 
        * testsuite/gas/ppc/power4.d: Adjust for removal of section sym.
index 069f63166431028a757e8df0ff06a52847f3d593..635a31cb48f763feeaa49fe69f77d5a70fc27740 100644 (file)
@@ -550,9 +550,10 @@ dwarf2_gen_line_info (addressT ofs, struct dwarf2_line_info *loc)
   /* Early out for as-yet incomplete location information.  */
   if (loc->line == 0)
     return;
-  if (loc->filenum == 0 && DWARF2_LINE_VERSION < 5)
+  if (loc->filenum == 0)
     {
-      dwarf_level = 5;
+      if (dwarf_level < 5)
+       dwarf_level = 5;
       if (DWARF2_LINE_VERSION < 5)
        return;
     }
@@ -1046,10 +1047,11 @@ dwarf2_directive_filename (void)
 
   num = get_absolute_expression ();
 
-  if ((offsetT) num < 1 && DWARF2_LINE_VERSION < 5)
+  if ((offsetT) num < 1)
     {
-      dwarf_level = 5;
-      if (DWARF2_LINE_VERSION < 5)
+      if (num == 0 && dwarf_level < 5)
+       dwarf_level = 5;
+      if ((offsetT) num < 0 || DWARF2_LINE_VERSION < 5)
        {
          as_bad (_("file number less than one"));
          ignore_rest_of_line ();
@@ -1149,18 +1151,16 @@ dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED)
 
   if (filenum < 1)
     {
-      if (filenum != 0 || DWARF2_LINE_VERSION < 5)
+      if (filenum == 0 && dwarf_level < 5)
+       dwarf_level = 5;
+      if (filenum < 0 || DWARF2_LINE_VERSION < 5)
        {
-         dwarf_level = 5;
-         if (DWARF2_LINE_VERSION < 5)
-           {
-             as_bad (_("file number less than one"));
-             return;
-           }
+         as_bad (_("file number less than one"));
+         return;
        }
     }
 
-  if (filenum >= (int) files_in_use || files[filenum].filename == NULL)
+  if ((valueT) filenum >= files_in_use || files[filenum].filename == NULL)
     {
       as_bad (_("unassigned file number %ld"), (long) filenum);
       return;