Add check to keep from segfaulting on a corrupt .debug_pubnames section.
authorCary Coutant <ccoutant@google.com>
Mon, 9 Jun 2014 21:55:02 +0000 (14:55 -0700)
committerCary Coutant <ccoutant@google.com>
Mon, 9 Jun 2014 21:55:02 +0000 (14:55 -0700)
gold/
* dwarf_reader.cc (Dwarf_pubnames_table::read_header): Check that
unit_length is within section bounds.

gold/ChangeLog
gold/dwarf_reader.cc

index 59661a0..151fcde 100644 (file)
@@ -1,5 +1,10 @@
 2014-06-09  Cary Coutant  <ccoutant@google.com>
 
+       * dwarf_reader.cc (Dwarf_pubnames_table::read_header): Check that
+       unit_length is within section bounds.
+
+2014-06-09  Cary Coutant  <ccoutant@google.com>
+
        PR gold/16980
        * layout.cc (Layout::print_to_mapfile): Print unattached sections in
        map.
index df14bd5..30aea10 100644 (file)
@@ -580,6 +580,12 @@ Dwarf_pubnames_table::read_header(off_t offset)
     }
   this->end_of_table_ = pinfo + unit_length;
 
+  // If unit_length is too big, maybe we should reject the whole table,
+  // but in cases we know about, it seems OK to assume that the table
+  // is valid through the actual end of the section.
+  if (this->end_of_table_ > this->buffer_end_)
+    this->end_of_table_ = this->buffer_end_;
+
   // Check the version.
   unsigned int version = this->dwinfo_->read_from_pointer<16>(pinfo);
   pinfo += 2;