diff options
author | Jonas Devlieghere <jonas@devlieghere.com> | 2017-12-11 18:22:47 +0000 |
---|---|---|
committer | Jonas Devlieghere <jonas@devlieghere.com> | 2017-12-11 18:22:47 +0000 |
commit | ba915897daebc34fa4e988e3e4c401ef122d68ce (patch) | |
tree | 1a176391c7481de445c0ed78c3360c1ebdf9f495 | |
parent | 6c4835978a1ece85d1ea26bddc9dcc73876f6b10 (diff) | |
download | bcm5719-llvm-ba915897daebc34fa4e988e3e4c401ef122d68ce.tar.gz bcm5719-llvm-ba915897daebc34fa4e988e3e4c401ef122d68ce.zip |
[dwarfdump] Fix off-by-one bug in accelerator table extractor.
This fixes a bug where the verifier was complaining about empty
accelerator tables. When the table is empty, its size is not a valid
offset as it points after the end of the section.
This patch also makes the extractor return llvm:Error instead of bool
for better error reporting in the verifier.
Differential revision: https://reviews.llvm.org/D41063
rdar://35932007
llvm-svn: 320399
-rw-r--r-- | llvm/include/llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h | 2 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp | 15 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/DWARF/DWARFContext.cpp | 3 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp | 4 | ||||
-rw-r--r-- | llvm/test/DebugInfo/Inputs/dwarfdump-objc.x86_64.o | bin | 15648 -> 15320 bytes | |||
-rw-r--r-- | llvm/test/DebugInfo/dwarfdump-accel.test | 2 |
6 files changed, 16 insertions, 10 deletions
diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h index e8abd3151e5..0bade10f620 100644 --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h @@ -90,7 +90,7 @@ public: DataExtractor StringSection) : AccelSection(AccelSection), StringSection(StringSection) {} - bool extract(); + llvm::Error extract(); uint32_t getNumBuckets(); uint32_t getNumHashes(); uint32_t getSizeHdr(); diff --git a/llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp b/llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp index f04ec7706cd..670191418cd 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp +++ b/llvm/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 @@ bool DWARFAcceleratorTable::extract() { // 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 @@ bool DWARFAcceleratorTable::extract() { } IsValid = true; - return true; + return Error::success(); } uint32_t DWARFAcceleratorTable::getNumBuckets() { return Hdr.NumBuckets; } diff --git a/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp b/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp index 414959c7a5c..a5defa90eb3 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp @@ -672,7 +672,8 @@ getAccelTable(std::unique_ptr<DWARFAcceleratorTable> &Cache, 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; } diff --git a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp index 8e07bb3c462..3d473698b46 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp @@ -686,8 +686,8 @@ unsigned DWARFVerifier::verifyAccelTable(const DWARFSection *AccelSection, } // 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; } diff --git a/llvm/test/DebugInfo/Inputs/dwarfdump-objc.x86_64.o b/llvm/test/DebugInfo/Inputs/dwarfdump-objc.x86_64.o Binary files differindex 8c0dcd56509..fff18e303aa 100644 --- a/llvm/test/DebugInfo/Inputs/dwarfdump-objc.x86_64.o +++ b/llvm/test/DebugInfo/Inputs/dwarfdump-objc.x86_64.o diff --git a/llvm/test/DebugInfo/dwarfdump-accel.test b/llvm/test/DebugInfo/dwarfdump-accel.test index ff28aa37c7f..14412f1681e 100644 --- a/llvm/test/DebugInfo/dwarfdump-accel.test +++ b/llvm/test/DebugInfo/dwarfdump-accel.test @@ -69,6 +69,6 @@ Verify the debug info in the apple_names accelerator table. 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. |