[Lldb-commits] [lldb] [llvm] [lldb][NativePDB] Fix crash in debugger when PDB has bad type index value (PR #166455)
Vladimir Gorsunov via lldb-commits
lldb-commits at lists.llvm.org
Thu Nov 6 20:46:18 PST 2025
https://github.com/gv updated https://github.com/llvm/llvm-project/pull/166455
>From ead6177350c54e094d4281fe48914e70926c6a8c Mon Sep 17 00:00:00 2001
From: Vladimir Gorsunov <gorsunov at gmail.com>
Date: Tue, 4 Nov 2025 23:44:08 +0200
Subject: [PATCH] [lldb][NativePDB] Fix crash in debugger when PDB has bad type
index value
Fix crash when an inline site record in the PDB file contains type
index which is out of bounds
---
.../SymbolFile/NativePDB/SymbolFileNativePDB.cpp | 14 +++++++++-----
.../DebugInfo/CodeView/LazyRandomTypeCollection.h | 2 +-
.../CodeView/LazyRandomTypeCollection.cpp | 15 ++++++++++-----
3 files changed, 20 insertions(+), 11 deletions(-)
diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp
index aaec1600dacff..8be6dd196c07c 100644
--- a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp
+++ b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp
@@ -1719,19 +1719,23 @@ void SymbolFileNativePDB::ParseInlineSite(PdbCompilandSymId id,
}
// Get the inlined function name.
- CVType inlinee_cvt = m_index->ipi().getType(inline_site.Inlinee);
std::string inlinee_name;
- if (inlinee_cvt.kind() == LF_MFUNC_ID) {
+ llvm::Expected<CVType> inlinee_cvt =
+ m_index->ipi().typeCollection().getTypeOrError(inline_site.Inlinee);
+ if (!inlinee_cvt) {
+ inlinee_name = "[error reading function name: " +
+ llvm::toString(inlinee_cvt.takeError()) + "]";
+ } else if (inlinee_cvt->kind() == LF_MFUNC_ID) {
MemberFuncIdRecord mfr;
cantFail(
- TypeDeserializer::deserializeAs<MemberFuncIdRecord>(inlinee_cvt, mfr));
+ TypeDeserializer::deserializeAs<MemberFuncIdRecord>(*inlinee_cvt, mfr));
LazyRandomTypeCollection &types = m_index->tpi().typeCollection();
inlinee_name.append(std::string(types.getTypeName(mfr.ClassType)));
inlinee_name.append("::");
inlinee_name.append(mfr.getName().str());
- } else if (inlinee_cvt.kind() == LF_FUNC_ID) {
+ } else if (inlinee_cvt->kind() == LF_FUNC_ID) {
FuncIdRecord fir;
- cantFail(TypeDeserializer::deserializeAs<FuncIdRecord>(inlinee_cvt, fir));
+ cantFail(TypeDeserializer::deserializeAs<FuncIdRecord>(*inlinee_cvt, fir));
TypeIndex parent_idx = fir.getParentScope();
if (!parent_idx.isNoneType()) {
LazyRandomTypeCollection &ids = m_index->ipi().typeCollection();
diff --git a/llvm/include/llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h b/llvm/include/llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h
index 5b23ac9f862a0..da18339b8662b 100644
--- a/llvm/include/llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h
+++ b/llvm/include/llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h
@@ -70,7 +70,7 @@ class LLVM_ABI LazyRandomTypeCollection : public TypeCollection {
uint32_t getOffsetOfType(TypeIndex Index);
std::optional<CVType> tryGetType(TypeIndex Index);
-
+ llvm::Expected<CVType> getTypeOrError(TypeIndex Index);
CVType getType(TypeIndex Index) override;
StringRef getTypeName(TypeIndex Index) override;
bool contains(TypeIndex Index) override;
diff --git a/llvm/lib/DebugInfo/CodeView/LazyRandomTypeCollection.cpp b/llvm/lib/DebugInfo/CodeView/LazyRandomTypeCollection.cpp
index 23ab5344df1ed..0b36c5085c086 100644
--- a/llvm/lib/DebugInfo/CodeView/LazyRandomTypeCollection.cpp
+++ b/llvm/lib/DebugInfo/CodeView/LazyRandomTypeCollection.cpp
@@ -93,20 +93,25 @@ CVType LazyRandomTypeCollection::getType(TypeIndex Index) {
return Records[Index.toArrayIndex()].Type;
}
-std::optional<CVType> LazyRandomTypeCollection::tryGetType(TypeIndex Index) {
+llvm::Expected<CVType>
+LazyRandomTypeCollection::getTypeOrError(TypeIndex Index) {
if (Index.isSimple())
- return std::nullopt;
+ return llvm::createStringError("Type index too low (%d)", Index.getIndex());
if (auto EC = ensureTypeExists(Index)) {
- consumeError(std::move(EC));
- return std::nullopt;
+ return EC;
}
if (!contains(Index))
- return std::nullopt;
+ return llvm::createStringError("Type index too high (%d)",
+ Index.getIndex());
return Records[Index.toArrayIndex()].Type;
}
+std::optional<CVType> LazyRandomTypeCollection::tryGetType(TypeIndex Index) {
+ return llvm::expectedToOptional(getTypeOrError(Index));
+}
+
StringRef LazyRandomTypeCollection::getTypeName(TypeIndex Index) {
if (Index.isNoneType() || Index.isSimple())
return TypeIndex::simpleTypeName(Index);
More information about the lldb-commits
mailing list