[binutils-gdb/binutils-2_35-branch] PR27218, memory access violation in dwarf2dbg.c

H.J. Lu hjl@sourceware.org
Tue Jan 26 14:26:02 GMT 2021


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=a2aa107b13785088fe417163b4f21e481e9f8130

commit a2aa107b13785088fe417163b4f21e481e9f8130
Author: Alan Modra <amodra@gmail.com>
Date:   Thu Jan 21 16:46:20 2021 +1030

    PR27218, memory access violation in dwarf2dbg.c
    
            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.
    
    (cherry picked from commit 498ff0328fed7689f7a675d8c9f0f04bed1f1522)

Diff:
---
 gas/ChangeLog   |  7 +++++++
 gas/dwarf2dbg.c | 26 +++++++++++++-------------
 2 files changed, 20 insertions(+), 13 deletions(-)

diff --git a/gas/ChangeLog b/gas/ChangeLog
index bb336ab9d5d..92ce9595d32 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,10 @@
+2021-01-25  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-25  H.J. Lu  <hongjiu.lu@intel.com>
 
 	PR gas/27195
diff --git a/gas/dwarf2dbg.c b/gas/dwarf2dbg.c
index 0195a82daf1..419582f9aa8 100644
--- a/gas/dwarf2dbg.c
+++ b/gas/dwarf2dbg.c
@@ -536,9 +536,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;
     }
@@ -1032,10 +1033,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 ();
@@ -1135,18 +1137,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;


More information about the Binutils-cvs mailing list