aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2021-01-21 16:46:20 +1030
committerH.J. Lu <hjl.tools@gmail.com>2021-01-26 06:24:00 -0800
commita2aa107b13785088fe417163b4f21e481e9f8130 (patch)
tree7937862b585a771d5084616cb1daea058298df19
parent74c2eff55954b850b8bc9804cbf4e599919a811a (diff)
downloadfsf-binutils-gdb-a2aa107b13785088fe417163b4f21e481e9f8130.zip
fsf-binutils-gdb-a2aa107b13785088fe417163b4f21e481e9f8130.tar.gz
fsf-binutils-gdb-a2aa107b13785088fe417163b4f21e481e9f8130.tar.bz2
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)
-rw-r--r--gas/ChangeLog7
-rw-r--r--gas/dwarf2dbg.c26
2 files changed, 20 insertions, 13 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index bb336ab..92ce959 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 0195a82..419582f 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;