summaryrefslogtreecommitdiff
path: root/plugins/rtti
diff options
context:
space:
mode:
authorMason Reed <mason@vector35.com>2025-04-20 12:25:00 -0400
committerPeter LaFosse <peter@vector35.com>2025-04-21 10:04:11 -0400
commit701c702aba757fbae54fc92e8e91e202cec92300 (patch)
tree77b908161cf8464b12f1d49ddcc1083c8141d478 /plugins/rtti
parent9410640770fd8abc2d09c69dada698c0b690eed3 (diff)
Fix misc invalid root type info construction in Itanium RTTI
Fixes https://github.com/Vector35/binaryninja-api/issues/6692
Diffstat (limited to 'plugins/rtti')
-rw-r--r--plugins/rtti/itanium.cpp7
1 files changed, 7 insertions, 0 deletions
diff --git a/plugins/rtti/itanium.cpp b/plugins/rtti/itanium.cpp
index 745324c7..95122fad 100644
--- a/plugins/rtti/itanium.cpp
+++ b/plugins/rtti/itanium.cpp
@@ -330,6 +330,13 @@ std::optional<TypeInfoVariant> ReadTypeInfoVariant(BinaryView *view, uint64_t ob
auto baseSymName = baseSym->GetShortName();
if (baseSymName.find("__cxxabiv1") != std::string::npos)
{
+ // Skip char array base data variables. This fixes the root base types being constructed twice at 0x0 and +0x8.
+ // 1400f81a0 void* _typeinfo_for___cxxabiv1::__class_type_info = data_1400fce10 <---- First at 0x0
+ // 1400f81a8 struct __cxxabiv1::__class_type_info _typeinfo_for_��@ = <----- Second at 0x8
+ DataVariable baseDV;
+ if (view->GetDataVariableAtAddress(typeInfo->base, baseDV) && baseDV.type->IsArray())
+ return std::nullopt;
+
// symbol takes the form of `abi::base_name::addend`
if (baseSymName.find("si_class_type_info") != std::string::npos)
return TIVSIClass;