瀏覽代碼

Fix assert/corrupt PDB when NumDirectoryBlocks > 128 (#2818)

Tex Riddell 5 年之前
父節點
當前提交
6ef33dcec6
共有 1 個文件被更改,包括 5 次插入2 次删除
  1. 5 2
      lib/DXIL/DxilPDB.cpp

+ 5 - 2
lib/DXIL/DxilPDB.cpp

@@ -188,7 +188,9 @@ struct MSFWriter {
     MSF_SuperBlock SB = CalculateSuperblock();
     const uint32_t NumDirectoryBlocks = GetNumBlocks(SB.NumDirectoryBytes);
     const uint32_t StreamDirectoryAddr = SB.BlockMapAddr;
-    const uint32_t StreamDirectoryStart = StreamDirectoryAddr + 1;
+    const uint32_t BlockAddrSize = NumDirectoryBlocks * sizeof(support::ulittle32_t);
+    const uint32_t NumBlockAddrBlocks = GetNumBlocks(BlockAddrSize);
+    const uint32_t StreamDirectoryStart = StreamDirectoryAddr + NumBlockAddrBlocks;
     const uint32_t StreamStart = StreamDirectoryStart + NumDirectoryBlocks;
 
     BlockWriter Writer(OS);
@@ -207,7 +209,8 @@ struct MSFWriter {
         V = Start++;
         BlockAddr.push_back(V);
       }
-      Writer.WriteBlocks(1, BlockAddr.data(), sizeof(BlockAddr[0])*BlockAddr.size());
+      assert(BlockAddrSize == sizeof(BlockAddr[0])*BlockAddr.size());
+      Writer.WriteBlocks(NumBlockAddrBlocks, BlockAddr.data(), BlockAddrSize);
     }
 
     // Stream Directory. Describes where all the streams are