From af87287534221d6c5b0e3425dfcbc84800b7c2f0 Mon Sep 17 00:00:00 2001 From: Mason Reed Date: Sat, 26 Apr 2025 20:48:33 -0400 Subject: Fix some RTTI information being overwritten by empty class info Finish verifying VMI base class info before applying data variable and symbol --- plugins/rtti/itanium.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'plugins/rtti/itanium.cpp') diff --git a/plugins/rtti/itanium.cpp b/plugins/rtti/itanium.cpp index f2b773b0..a6e85b4d 100644 --- a/plugins/rtti/itanium.cpp +++ b/plugins/rtti/itanium.cpp @@ -397,16 +397,10 @@ std::optional ItaniumRTTIProcessor::ProcessRTTI(uint64_t objectAddr) auto typeInfo = TypeInfo(m_view, objectAddr); auto className = DemangleNameItanium(m_view, allowMangledClassNames, typeInfo.type_name); - if (!className.has_value()) + if (!className.has_value() || className->empty()) return std::nullopt; auto classInfo = ClassInfo{RTTIProcessorType::Itanium, className.value()}; - auto typeInfoName = fmt::format("_typeinfo_for_{}", classInfo.className); - auto typeInfoSymbol = m_view->GetSymbolByAddress(objectAddr); - if (typeInfoSymbol != nullptr) - m_view->UndefineAutoSymbol(typeInfoSymbol); - m_view->DefineAutoSymbol(new Symbol{DataSymbol, typeInfoName, objectAddr}); - auto nameFromTypeInfoSymbol = [&](uint64_t addr) -> std::optional { auto sym = m_view->GetSymbolByAddress(addr); if (sym == nullptr || sym->GetType() != ExternalSymbol) @@ -457,7 +451,6 @@ std::optional ItaniumRTTIProcessor::ProcessRTTI(uint64_t objectAddr) else if (typeInfoVariant == TIVVMIClass) { auto vmiClassTypeInfo = VMIClassTypeInfo(m_view, objectAddr); - m_view->DefineDataVariable(objectAddr, Confidence(VMIClassTypeInfoType(m_view, vmiClassTypeInfo.base_count), 255)); for (const auto& baseInfo : vmiClassTypeInfo.base_info) { // Remove the flags and just get the offset @@ -488,12 +481,20 @@ std::optional ItaniumRTTIProcessor::ProcessRTTI(uint64_t objectAddr) auto baseClassInfo = BaseClassInfo {baseClassName.value(), offset}; classInfo.baseClasses.emplace_back(baseClassInfo); } + m_view->DefineDataVariable(objectAddr, Confidence(VMIClassTypeInfoType(m_view, vmiClassTypeInfo.base_count), 255)); } else { m_view->DefineDataVariable(objectAddr, Confidence(ClassTypeInfoType(m_view), 255)); } + // Defining the data variable was a success, so we can add the symbol now. + auto typeInfoName = fmt::format("_typeinfo_for_{}", classInfo.className); + auto typeInfoSymbol = m_view->GetSymbolByAddress(objectAddr); + if (typeInfoSymbol != nullptr) + m_view->UndefineAutoSymbol(typeInfoSymbol); + m_view->DefineAutoSymbol(new Symbol{DataSymbol, typeInfoName, objectAddr}); + return classInfo; } -- cgit v1.3.1