diff options
Diffstat (limited to 'llvm/lib/DebugInfo/MSF')
-rw-r--r-- | llvm/lib/DebugInfo/MSF/MSFBuilder.cpp | 12 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/MSF/MSFError.cpp | 2 |
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"); } |