aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/DebugInfo/MSF
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/DebugInfo/MSF')
-rw-r--r--llvm/lib/DebugInfo/MSF/MSFBuilder.cpp12
-rw-r--r--llvm/lib/DebugInfo/MSF/MSFError.cpp2
2 files changed, 14 insertions, 0 deletions
diff --git a/llvm/lib/DebugInfo/MSF/MSFBuilder.cpp b/llvm/lib/DebugInfo/MSF/MSFBuilder.cpp
index f9a763d724a8..c26caa647ed9 100644
--- a/llvm/lib/DebugInfo/MSF/MSFBuilder.cpp
+++ b/llvm/lib/DebugInfo/MSF/MSFBuilder.cpp
@@ -364,6 +364,18 @@ Expected<FileBufferByteStream> MSFBuilder::commit(StringRef Path,
FileSize, Layout.SB->BlockSize));
}
+ uint64_t NumDirectoryBlocks =
+ bytesToBlocks(Layout.SB->NumDirectoryBytes, Layout.SB->BlockSize);
+ uint64_t DirectoryBlockMapSize =
+ NumDirectoryBlocks * sizeof(support::ulittle32_t);
+ if (DirectoryBlockMapSize > Layout.SB->BlockSize) {
+ return make_error<MSFError>(msf_error_code::stream_directory_overflow,
+ formatv("The directory block map ({0} bytes) "
+ "doesn't fit in a block ({1} bytes)",
+ DirectoryBlockMapSize,
+ Layout.SB->BlockSize));
+ }
+
auto OutFileOrError = FileOutputBuffer::create(Path, FileSize);
if (auto EC = OutFileOrError.takeError())
return std::move(EC);
diff --git a/llvm/lib/DebugInfo/MSF/MSFError.cpp b/llvm/lib/DebugInfo/MSF/MSFError.cpp
index fd93c3e726cc..dbd8648c4d41 100644
--- a/llvm/lib/DebugInfo/MSF/MSFError.cpp
+++ b/llvm/lib/DebugInfo/MSF/MSFError.cpp
@@ -43,6 +43,8 @@ public:
return "The data is in an unexpected format.";
case msf_error_code::block_in_use:
return "The block is already in use.";
+ case msf_error_code::stream_directory_overflow:
+ return "PDB stream directory too large.";
}
llvm_unreachable("Unrecognized msf_error_code");
}