mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-04 17:56:53 +00:00
[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
This commit is contained in:
parent
7314a7c5b2
commit
7c2703138c
@ -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();
|
||||
|
@ -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; }
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Binary file not shown.
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user