diff --git a/lib/DebugInfo/MSF/MSFCommon.cpp b/lib/DebugInfo/MSF/MSFCommon.cpp index d79ccafe898..fdab7884646 100644 --- a/lib/DebugInfo/MSF/MSFCommon.cpp +++ b/lib/DebugInfo/MSF/MSFCommon.cpp @@ -44,5 +44,14 @@ Error llvm::msf::validateSuperBlock(const SuperBlock &SB) { return make_error(msf_error_code::invalid_format, "Block 0 is reserved"); + if (SB.BlockMapAddr >= SB.NumBlocks) + return make_error(msf_error_code::invalid_format, + "Block map address is invalid."); + + if (SB.FreeBlockMapBlock != 1 && SB.FreeBlockMapBlock != 2) + return make_error( + msf_error_code::invalid_format, + "The free block map isn't at block 1 or block 2."); + return Error::success(); } diff --git a/unittests/DebugInfo/PDB/MSFBuilderTest.cpp b/unittests/DebugInfo/PDB/MSFBuilderTest.cpp index bc1ec522fb4..5f2f0c271e9 100644 --- a/unittests/DebugInfo/PDB/MSFBuilderTest.cpp +++ b/unittests/DebugInfo/PDB/MSFBuilderTest.cpp @@ -30,6 +30,7 @@ protected: ::memset(&SB, 0, sizeof(SB)); ::memcpy(SB.MagicBytes, msf::Magic, sizeof(msf::Magic)); + SB.FreeBlockMapBlock = 1; SB.BlockMapAddr = 1; SB.BlockSize = 4096; SB.NumDirectoryBytes = 0;