[pdb] handle missing pdb streams more gracefully
Summary: The code we use to read PDBs assumed that streams we ask it to read exist, and would read memory outside a vector and crash if this wasn't the case. This would, for example, cause llvm-pdbdump to crash on PDBs generated by lld. This patch handles such cases more gracefully: the PDB reading code in LLVM now reports errors when asked to get a stream that is not present, and llvm-pdbdump will report missing streams and continue processing streams that are present.
Reviewers: ruiu, zturner
Subscribers: thakis, amccarth
Differential Revision: https://reviews.llvm.org/D27325
llvm-svn: 288722
diff --git a/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp b/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp
index 2287e0d..b6bf5cf 100644
--- a/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp
+++ b/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp
@@ -350,11 +350,23 @@
Error LLVMOutputStyle::dumpGlobalsStream() {
if (!opts::raw::DumpGlobals)
return Error::success();
+ if (!File.hasPDBGlobalsStream()) {
+ P.printString("Globals Stream not present");
+ return Error::success();
+ }
- DictScope D(P, "Globals Stream");
auto Globals = File.getPDBGlobalsStream();
if (!Globals)
- return Globals.takeError();
+ return handleErrors(Globals.takeError(),
+ [&](const msf::MSFError &E) -> Error {
+ if (E.Code == msf::msf_error_code::no_stream) {
+ P.printString("Globals Stream not present");
+ return Error::success();
+ } else {
+ return make_error<msf::MSFError>(E);
+ }
+ });
+ DictScope D(P, "Globals Stream");
auto Dbi = File.getPDBDbiStream();
if (!Dbi)
@@ -447,6 +459,10 @@
Error LLVMOutputStyle::dumpInfoStream() {
if (!opts::raw::DumpHeaders)
return Error::success();
+ if (!File.hasPDBInfoStream()) {
+ P.printString("PDB Stream not present");
+ return Error::success();
+ }
auto IS = File.getPDBInfoStream();
if (!IS)
return IS.takeError();
@@ -485,11 +501,19 @@
StringRef Label;
StringRef VerLabel;
if (StreamIdx == StreamTPI) {
+ if (!File.hasPDBTpiStream()) {
+ P.printString("Type Info Stream (TPI) not present");
+ return Error::success();
+ }
DumpRecordBytes = opts::raw::DumpTpiRecordBytes;
DumpRecords = opts::raw::DumpTpiRecords;
Label = "Type Info Stream (TPI)";
VerLabel = "TPI Version";
} else if (StreamIdx == StreamIPI) {
+ if (!File.hasPDBIpiStream()) {
+ P.printString("Type Info Stream (IPI) not present");
+ return Error::success();
+ }
DumpRecordBytes = opts::raw::DumpIpiRecordBytes;
DumpRecords = opts::raw::DumpIpiRecords;
Label = "Type Info Stream (IPI)";
@@ -556,6 +580,10 @@
opts::raw::DumpModuleFiles || opts::raw::DumpLineInfo;
if (!opts::raw::DumpHeaders && !DumpModules)
return Error::success();
+ if (!File.hasPDBDbiStream()) {
+ P.printString("DBI Stream not present");
+ return Error::success();
+ }
auto DS = File.getPDBDbiStream();
if (!DS)
@@ -742,6 +770,10 @@
Error LLVMOutputStyle::dumpSectionContribs() {
if (!opts::raw::DumpSectionContribs)
return Error::success();
+ if (!File.hasPDBDbiStream()) {
+ P.printString("DBI Stream not present");
+ return Error::success();
+ }
auto Dbi = File.getPDBDbiStream();
if (!Dbi)
@@ -789,6 +821,10 @@
Error LLVMOutputStyle::dumpSectionMap() {
if (!opts::raw::DumpSectionMap)
return Error::success();
+ if (!File.hasPDBDbiStream()) {
+ P.printString("DBI Stream not present");
+ return Error::success();
+ }
auto Dbi = File.getPDBDbiStream();
if (!Dbi)
@@ -813,11 +849,15 @@
Error LLVMOutputStyle::dumpPublicsStream() {
if (!opts::raw::DumpPublics)
return Error::success();
+ if (!File.hasPDBPublicsStream()) {
+ P.printString("Publics Stream not present");
+ return Error::success();
+ }
- DictScope D(P, "Publics Stream");
auto Publics = File.getPDBPublicsStream();
if (!Publics)
return Publics.takeError();
+ DictScope D(P, "Publics Stream");
auto Dbi = File.getPDBDbiStream();
if (!Dbi)
@@ -856,6 +896,10 @@
Error LLVMOutputStyle::dumpSectionHeaders() {
if (!opts::raw::DumpSectionHeaders)
return Error::success();
+ if (!File.hasPDBDbiStream()) {
+ P.printString("DBI Stream not present");
+ return Error::success();
+ }
auto Dbi = File.getPDBDbiStream();
if (!Dbi)
@@ -885,6 +929,10 @@
Error LLVMOutputStyle::dumpFpoStream() {
if (!opts::raw::DumpFpo)
return Error::success();
+ if (!File.hasPDBDbiStream()) {
+ P.printString("DBI Stream not present");
+ return Error::success();
+ }
auto Dbi = File.getPDBDbiStream();
if (!Dbi)