summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/DebugInfo/PDB/Raw/PDBFile.h9
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/PDBFile.cpp20
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/PDBStream.cpp11
-rw-r--r--llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp2
4 files changed, 19 insertions, 23 deletions
diff --git a/llvm/include/llvm/DebugInfo/PDB/Raw/PDBFile.h b/llvm/include/llvm/DebugInfo/PDB/Raw/PDBFile.h
index 78c05ace728..0fdba82143b 100644
--- a/llvm/include/llvm/DebugInfo/PDB/Raw/PDBFile.h
+++ b/llvm/include/llvm/DebugInfo/PDB/Raw/PDBFile.h
@@ -12,6 +12,7 @@
#include "llvm/ADT/DenseMap.h"
#include "llvm/Support/Endian.h"
+#include "llvm/Support/MathExtras.h"
#include <memory>
@@ -45,6 +46,14 @@ public:
std::error_code parseFileHeaders();
std::error_code parseStreamData();
+ static uint64_t bytesToBlocks(uint64_t NumBytes, uint64_t BlockSize) {
+ return alignTo(NumBytes, BlockSize) / BlockSize;
+ }
+
+ static uint64_t blockToOffset(uint64_t BlockNumber, uint64_t BlockSize) {
+ return BlockNumber * BlockSize;
+ }
+
private:
std::unique_ptr<PDBContext> Context;
};
diff --git a/llvm/lib/DebugInfo/PDB/Raw/PDBFile.cpp b/llvm/lib/DebugInfo/PDB/Raw/PDBFile.cpp
index fc5231f552b..12a717db49b 100644
--- a/llvm/lib/DebugInfo/PDB/Raw/PDBFile.cpp
+++ b/llvm/lib/DebugInfo/PDB/Raw/PDBFile.cpp
@@ -50,9 +50,8 @@ struct llvm::PDBContext {
DenseMap<uint32_t, std::vector<uint32_t>> StreamMap;
};
-namespace {
-std::error_code checkOffset(MemoryBufferRef M, uintptr_t Addr,
- const uint64_t Size) {
+static std::error_code checkOffset(MemoryBufferRef M, uintptr_t Addr,
+ const uint64_t Size) {
if (Addr + Size < Addr || Addr + Size < Size ||
Addr + Size > uintptr_t(M.getBufferEnd()) ||
Addr < uintptr_t(M.getBufferStart())) {
@@ -62,19 +61,10 @@ std::error_code checkOffset(MemoryBufferRef M, uintptr_t Addr,
}
template <typename T>
-std::error_code checkOffset(MemoryBufferRef M, ArrayRef<T> AR) {
+static std::error_code checkOffset(MemoryBufferRef M, ArrayRef<T> AR) {
return checkOffset(M, uintptr_t(AR.data()), (uint64_t)AR.size() * sizeof(T));
}
-uint64_t bytesToBlocks(uint64_t NumBytes, uint64_t BlockSize) {
- return alignTo(NumBytes, BlockSize) / BlockSize;
-}
-
-uint64_t blockToOffset(uint64_t BlockNumber, uint64_t BlockSize) {
- return BlockNumber * BlockSize;
-}
-}
-
PDBFile::PDBFile(std::unique_ptr<MemoryBuffer> MemBuffer) {
Context.reset(new PDBContext());
Context->Buffer = std::move(MemBuffer);
@@ -130,6 +120,10 @@ std::error_code PDBFile::parseFileHeaders() {
Context->SB =
reinterpret_cast<const SuperBlock *>(BufferRef.getBufferStart());
const SuperBlock *SB = Context->SB;
+ // Check the magic bytes.
+ if (memcmp(SB->MagicBytes, Magic, sizeof(Magic)) != 0)
+ return std::make_error_code(std::errc::illegal_byte_sequence);
+
// We don't support blocksizes which aren't a multiple of four bytes.
if (SB->BlockSize % sizeof(support::ulittle32_t) != 0)
return std::make_error_code(std::errc::not_supported);
diff --git a/llvm/lib/DebugInfo/PDB/Raw/PDBStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/PDBStream.cpp
index 310454df824..c20ffc914d2 100644
--- a/llvm/lib/DebugInfo/PDB/Raw/PDBStream.cpp
+++ b/llvm/lib/DebugInfo/PDB/Raw/PDBStream.cpp
@@ -12,14 +12,6 @@
using namespace llvm;
-static uint64_t bytesToBlocks(uint64_t NumBytes, uint64_t BlockSize) {
- return alignTo(NumBytes, BlockSize) / BlockSize;
-}
-
-static uint64_t blockToOffset(uint64_t BlockNumber, uint64_t BlockSize) {
- return BlockNumber * BlockSize;
-}
-
PDBStream::PDBStream(uint32_t StreamIdx, const PDBFile &File) : Pdb(File) {
this->StreamLength = Pdb.getStreamByteSize(StreamIdx);
this->BlockList = Pdb.getStreamBlockList(StreamIdx);
@@ -73,7 +65,8 @@ std::error_code PDBStream::readBytes(void *Dest, uint32_t Length) {
while (BytesLeft > 0) {
uint32_t StreamBlockAddr = this->BlockList[BlockNum];
uint64_t StreamBlockOffset =
- blockToOffset(StreamBlockAddr, Pdb.getBlockSize()) + OffsetInBlock;
+ PDBFile::blockToOffset(StreamBlockAddr, Pdb.getBlockSize()) +
+ OffsetInBlock;
StringRef Data = Pdb.getBlockData(StreamBlockAddr, Pdb.getBlockSize());
diff --git a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
index cd76b4be4d1..c114b892620 100644
--- a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
+++ b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
@@ -192,7 +192,7 @@ static void dumpStructure(RawSession &RS) {
outs() << "NumStreams: " << File.getNumStreams() << '\n';
uint32_t StreamCount = File.getNumStreams();
if (opts::DumpStreamSizes) {
- for (uint32_t StreamIdx = 0; StreamCount; ++StreamIdx)
+ for (uint32_t StreamIdx = 0; StreamIdx < StreamCount; ++StreamIdx)
outs() << "StreamSizes[" << StreamIdx
<< "]: " << File.getStreamByteSize(StreamIdx) << '\n';
}
OpenPOWER on IntegriCloud