https://github.com/gv updated https://github.com/llvm/llvm-project/pull/166455
>From 2ef9272549d2fb1b63256730d41ac9570a4a909e Mon Sep 17 00:00:00 2001 From: Vladimir Gorsunov <[email protected]> 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 --- .../NativePDB/SymbolFileNativePDB.cpp | 14 +++++++++----- .../CodeView/LazyRandomTypeCollection.h | 2 +- .../CodeView/LazyRandomTypeCollection.cpp | 18 +++++++++++++----- 3 files changed, 23 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..6e6225ae922a7 100644 --- a/llvm/lib/DebugInfo/CodeView/LazyRandomTypeCollection.cpp +++ b/llvm/lib/DebugInfo/CodeView/LazyRandomTypeCollection.cpp @@ -93,20 +93,28 @@ 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) { + llvm::Expected<CVType> res = getTypeOrError(Index); + if (!res) + return std::nullopt; + return *res; +} + StringRef LazyRandomTypeCollection::getTypeName(TypeIndex Index) { if (Index.isNoneType() || Index.isSimple()) return TypeIndex::simpleTypeName(Index); _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
