]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Ignore line tables whose versions we don't support.
authorCary Coutant <ccoutant@google.com>
Wed, 21 Jan 2015 23:45:55 +0000 (15:45 -0800)
committerCary Coutant <ccoutant@google.com>
Wed, 21 Jan 2015 23:45:55 +0000 (15:45 -0800)
2015-01-21  Cary Coutant  <ccoutant@google.com>

gold/
* dwarf_reader.cc (Sized_dwarf_line_info::read_header_prolog): Check
line table version number.
(Sized_dwarf_line_info::read_line_mappings): Likewise.

gold/dwarf_reader.cc

index e7c95ce64975be9dfdf3bc0dfd8a3e5153d97a22..bd641d1f22d56c79f255ae0a4490e4f55e322242 100644 (file)
@@ -1638,11 +1638,17 @@ Sized_dwarf_line_info<size, big_endian>::read_header_prolog(
 
   header_.total_length = initial_length;
 
+  const unsigned char* end_of_initial_length = lineptr;
   gold_assert(lineptr + header_.total_length <= buffer_end_);
 
   header_.version = elfcpp::Swap_unaligned<16, big_endian>::readval(lineptr);
   lineptr += 2;
 
+  // We can only read versions 2 and 3 of the DWARF line number table.
+  // For other versions, just skip the entire line number table.
+  if (header_.version < 2 || header_.version > 3)
+    return end_of_initial_length + initial_length;
+
   if (header_.offset_size == 4)
     header_.prologue_length = elfcpp::Swap_unaligned<32, big_endian>::readval(lineptr);
   else
@@ -2027,8 +2033,11 @@ Sized_dwarf_line_info<size, big_endian>::read_line_mappings(unsigned int shndx)
     {
       const unsigned char* lineptr = this->buffer_;
       lineptr = this->read_header_prolog(lineptr);
-      lineptr = this->read_header_tables(lineptr);
-      lineptr = this->read_lines(lineptr, shndx);
+      if (header_.version >= 2 && header_.version <= 3)
+       {
+         lineptr = this->read_header_tables(lineptr);
+         lineptr = this->read_lines(lineptr, shndx);
+       }
       this->buffer_ = lineptr;
     }