[PATCH] D41063: [dwarfdump] Fix off-by-one bug in accelerator table extractor.

Jonas Devlieghere via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 11 10:23:39 PST 2017


This revision was automatically updated to reflect the committed changes.
Closed by commit rL320399: [dwarfdump] Fix off-by-one bug in accelerator table extractor. (authored by JDevlieghere).

Changed prior to commit:
  https://reviews.llvm.org/D41063?vs=126361&id=126399#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D41063

Files:
  llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h
  llvm/trunk/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp
  llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp
  llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp
  llvm/trunk/test/DebugInfo/Inputs/dwarfdump-objc.x86_64.o
  llvm/trunk/test/DebugInfo/dwarfdump-accel.test


Index: llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp
===================================================================
--- llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp
+++ llvm/trunk/lib/DebugInfo/DWARF/DWARFContext.cpp
@@ -672,7 +672,8 @@
   DWARFDataExtractor AccelSection(Obj, Section, IsLittleEndian, 0);
   DataExtractor StrData(StringSection, IsLittleEndian, 0);
   Cache.reset(new DWARFAcceleratorTable(AccelSection, StrData));
-  Cache->extract();
+  if (Error E = Cache->extract())
+    llvm::consumeError(std::move(E));
   return *Cache;
 }
 
Index: llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp
===================================================================
--- llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp
+++ llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp
@@ -686,8 +686,8 @@
   }
 
   // Verify that the section is not too short.
-  if (!AccelTable.extract()) {
-    error() << "Section is smaller than size described in section header.\n";
+  if (Error E = AccelTable.extract()) {
+    error() << toString(std::move(E)) << '\n';
     return 1;
   }
 
Index: llvm/trunk/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp
===================================================================
--- llvm/trunk/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp
+++ llvm/trunk/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp
@@ -22,12 +22,13 @@
 
 using namespace llvm;
 
-bool DWARFAcceleratorTable::extract() {
+llvm::Error DWARFAcceleratorTable::extract() {
   uint32_t Offset = 0;
 
   // Check that we can at least read the header.
   if (!AccelSection.isValidOffset(offsetof(Header, HeaderDataLength)+4))
-    return false;
+    return make_error<StringError>("Section too small: cannot read header.",
+                                   inconvertibleErrorCode());
 
   Hdr.Magic = AccelSection.getU32(&Offset);
   Hdr.Version = AccelSection.getU16(&Offset);
@@ -38,9 +39,13 @@
 
   // Check that we can read all the hashes and offsets from the
   // section (see SourceLevelDebugging.rst for the structure of the index).
+  // We need to substract one because we're checking for an *offset* which is
+  // equal to the size for an empty table and hence pointer after the section.
   if (!AccelSection.isValidOffset(sizeof(Hdr) + Hdr.HeaderDataLength +
-                                  Hdr.NumBuckets*4 + Hdr.NumHashes*8))
-    return false;
+                                  Hdr.NumBuckets * 4 + Hdr.NumHashes * 8 - 1))
+    return make_error<StringError>(
+        "Section too small: cannot read buckets and hashes.",
+        inconvertibleErrorCode());
 
   HdrData.DIEOffsetBase = AccelSection.getU32(&Offset);
   uint32_t NumAtoms = AccelSection.getU32(&Offset);
@@ -52,7 +57,7 @@
   }
 
   IsValid = true;
-  return true;
+  return Error::success();
 }
 
 uint32_t DWARFAcceleratorTable::getNumBuckets() { return Hdr.NumBuckets; }
Index: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h
===================================================================
--- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h
+++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h
@@ -90,7 +90,7 @@
                         DataExtractor StringSection)
       : AccelSection(AccelSection), StringSection(StringSection) {}
 
-  bool extract();
+  llvm::Error extract();
   uint32_t getNumBuckets();
   uint32_t getNumHashes();
   uint32_t getSizeHdr();
Index: llvm/trunk/test/DebugInfo/dwarfdump-accel.test
===================================================================
--- llvm/trunk/test/DebugInfo/dwarfdump-accel.test
+++ llvm/trunk/test/DebugInfo/dwarfdump-accel.test
@@ -69,6 +69,6 @@
 VERIFY: Verifying .apple_names...
 VERIFY-NEXT: Verifying .apple_types...
 VERIFY-NEXT: Verifying .apple_namespaces...
-VERIFY-NEXT: error: Section is smaller than size described in section header.
+VERIFY-NEXT: error: Section too small: cannot read buckets and hashes.
 VERIFY-NEXT: Verifying .apple_objc...
 VERIFY-NEXT: Errors detected.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D41063.126399.patch
Type: text/x-patch
Size: 3992 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171211/57167f7c/attachment.bin>


More information about the llvm-commits mailing list