diff options
| author | Mason Reed <mason@vector35.com> | 2025-04-26 20:48:33 -0400 |
|---|---|---|
| committer | Mason Reed <mason@vector35.com> | 2025-04-26 20:48:33 -0400 |
| commit | af87287534221d6c5b0e3425dfcbc84800b7c2f0 (patch) | |
| tree | fc5f733b78dcb2c2bcd6283923d82453f873a15d /plugins/rtti/itanium.cpp | |
| parent | 51903e9ca5f269979b84ddcc7f5019b492d8b9ff (diff) | |
Fix some RTTI information being overwritten by empty class info
Finish verifying VMI base class info before applying data variable and symbol
Diffstat (limited to 'plugins/rtti/itanium.cpp')
| -rw-r--r-- | plugins/rtti/itanium.cpp | 17 |
1 files changed, 9 insertions, 8 deletions
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<ClassInfo> 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<std::string> { auto sym = m_view->GetSymbolByAddress(addr); if (sym == nullptr || sym->GetType() != ExternalSymbol) @@ -457,7 +451,6 @@ std::optional<ClassInfo> 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<ClassInfo> 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; } |
