diff options
author | Zachary Turner <zturner@google.com> | 2016-06-08 17:26:39 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2016-06-08 17:26:39 +0000 |
commit | a1657a9e64c1e8df34e32ca69fac918a7d28c60a (patch) | |
tree | 74993d26964f0f2f28bed1a30e85b19401a2f34e /llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp | |
parent | ced0853b468dadcf50ad5dae68017e3cd9c86bda (diff) | |
download | bcm5719-llvm-a1657a9e64c1e8df34e32ca69fac918a7d28c60a.tar.gz bcm5719-llvm-a1657a9e64c1e8df34e32ca69fac918a7d28c60a.zip |
[pdb] Handle stream index errors better.
Reviewed By: ruiu
Differential Revision: http://reviews.llvm.org/D21128
llvm-svn: 272172
Diffstat (limited to 'llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp')
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp | 49 |
1 files changed, 26 insertions, 23 deletions
diff --git a/llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp index 90bc2a2e556..ae3faa700c1 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/DbiStream.cpp @@ -93,19 +93,17 @@ Error loadSectionContribs(FixedStreamArray<ContribType> &Output, return Error::success(); } -DbiStream::DbiStream(PDBFile &File) - : Pdb(File), - Stream(llvm::make_unique<IndexedStreamData>(StreamDBI, File), File), - Header(nullptr) { +DbiStream::DbiStream(PDBFile &File, std::unique_ptr<MappedBlockStream> Stream) + : Pdb(File), Stream(std::move(Stream)), Header(nullptr) { static_assert(sizeof(HeaderInfo) == 64, "Invalid HeaderInfo size!"); } DbiStream::~DbiStream() {} Error DbiStream::reload() { - StreamReader Reader(Stream); + StreamReader Reader(*Stream); - if (Stream.getLength() < sizeof(HeaderInfo)) + if (Stream->getLength() < sizeof(HeaderInfo)) return make_error<RawError>(raw_error_code::corrupt_file, "DBI Stream does not contain a header."); if (auto EC = Reader.readObject(Header)) @@ -123,15 +121,15 @@ Error DbiStream::reload() { return make_error<RawError>(raw_error_code::feature_unsupported, "Unsupported DBI version."); - auto InfoStream = Pdb.getPDBInfoStream(); - if (auto EC = InfoStream.takeError()) - return EC; + auto IS = Pdb.getPDBInfoStream(); + if (!IS) + return IS.takeError(); - if (Header->Age != InfoStream.get().getAge()) + if (Header->Age != IS->getAge()) return make_error<RawError>(raw_error_code::corrupt_file, "DBI Age does not match PDB Age."); - if (Stream.getLength() != + if (Stream->getLength() != sizeof(HeaderInfo) + Header->ModiSubstreamSize + Header->SecContrSubstreamSize + Header->SectionMapSize + Header->FileInfoSize + Header->TypeServerSize + @@ -296,19 +294,22 @@ Error DbiStream::initializeSectionHeadersData() { if (StreamNum >= Pdb.getNumStreams()) return make_error<RawError>(raw_error_code::no_stream); - SectionHeaderStream.reset(new MappedBlockStream( - llvm::make_unique<IndexedStreamData>(StreamNum, Pdb), Pdb)); + auto SHS = MappedBlockStream::createIndexedStream(StreamNum, Pdb); + if (!SHS) + return SHS.takeError(); - size_t StreamLen = SectionHeaderStream->getLength(); + size_t StreamLen = (*SHS)->getLength(); if (StreamLen % sizeof(object::coff_section)) return make_error<RawError>(raw_error_code::corrupt_file, "Corrupted section header stream."); size_t NumSections = StreamLen / sizeof(object::coff_section); - codeview::StreamReader Reader(*SectionHeaderStream); + codeview::StreamReader Reader(**SHS); if (auto EC = Reader.readArray(SectionHeaders, NumSections)) return make_error<RawError>(raw_error_code::corrupt_file, "Could not read a bitmap."); + + SectionHeaderStream = std::move(*SHS); return Error::success(); } @@ -318,19 +319,21 @@ Error DbiStream::initializeFpoRecords() { if (StreamNum >= Pdb.getNumStreams()) return make_error<RawError>(raw_error_code::no_stream); - FpoStream.reset(new MappedBlockStream( - llvm::make_unique<IndexedStreamData>(StreamNum, Pdb), Pdb)); + auto FS = MappedBlockStream::createIndexedStream(StreamNum, Pdb); + if (!FS) + return FS.takeError(); - size_t StreamLen = FpoStream->getLength(); + size_t StreamLen = (*FS)->getLength(); if (StreamLen % sizeof(object::FpoData)) return make_error<RawError>(raw_error_code::corrupt_file, "Corrupted New FPO stream."); size_t NumRecords = StreamLen / sizeof(object::FpoData); - codeview::StreamReader Reader(*FpoStream); + codeview::StreamReader Reader(**FS); if (auto EC = Reader.readArray(FpoRecords, NumRecords)) return make_error<RawError>(raw_error_code::corrupt_file, "Corrupted New FPO stream."); + FpoStream = std::move(*FS); return Error::success(); } @@ -418,10 +421,10 @@ Error DbiStream::initializeFileInfo() { uint32_t NumFiles = ModFileCountArray[I]; ModuleInfos[I].SourceFiles.resize(NumFiles); for (size_t J = 0; J < NumFiles; ++J, ++NextFileIndex) { - if (auto Name = getFileNameForIndex(NextFileIndex)) - ModuleInfos[I].SourceFiles[J] = Name.get(); - else - return Name.takeError(); + auto ThisName = getFileNameForIndex(NextFileIndex); + if (!ThisName) + return ThisName.takeError(); + ModuleInfos[I].SourceFiles[J] = *ThisName; } } |