Index: llvm/include/llvm/DebugInfo/MSF/MSFError.h =================================================================== --- llvm/include/llvm/DebugInfo/MSF/MSFError.h +++ llvm/include/llvm/DebugInfo/MSF/MSFError.h @@ -23,7 +23,8 @@ not_writable, no_stream, invalid_format, - block_in_use + block_in_use, + stream_directory_overflow }; } // namespace msf } // namespace llvm Index: llvm/lib/DebugInfo/MSF/MSFBuilder.cpp =================================================================== --- llvm/lib/DebugInfo/MSF/MSFBuilder.cpp +++ llvm/lib/DebugInfo/MSF/MSFBuilder.cpp @@ -364,6 +364,18 @@ 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(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); Index: llvm/lib/DebugInfo/MSF/MSFError.cpp =================================================================== --- llvm/lib/DebugInfo/MSF/MSFError.cpp +++ llvm/lib/DebugInfo/MSF/MSFError.cpp @@ -43,6 +43,8 @@ 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"); }