summaryrefslogtreecommitdiff
path: root/binaryviewtype.cpp
diff options
context:
space:
mode:
authorRusty Wagner <rusty.wagner@gmail.com>2023-01-24 18:38:13 -0700
committerRusty Wagner <rusty.wagner@gmail.com>2023-01-30 11:57:43 -0500
commita3939bdec15f9299ae9a681255fa93c47113870a (patch)
tree2b4bb5643ac3cd25a618a99a542968fe81c66bcc /binaryviewtype.cpp
parentcf4220570c2d1b7105fb29719383f64026d46837 (diff)
Fix UAF on C++ BinaryView plugin init, improve demangler and BinaryView APIs
Diffstat (limited to 'binaryviewtype.cpp')
-rw-r--r--binaryviewtype.cpp43
1 files changed, 40 insertions, 3 deletions
diff --git a/binaryviewtype.cpp b/binaryviewtype.cpp
index b1f9ebe9..8ab09aae 100644
--- a/binaryviewtype.cpp
+++ b/binaryviewtype.cpp
@@ -243,7 +243,7 @@ string BinaryViewType::GetLongName()
bool BinaryViewType::IsDeprecated()
{
- return BNIsBinaryViewTypeDeprecated(m_object);
+ return false;
}
@@ -283,10 +283,41 @@ BNPlatform* BinaryViewType::PlatformRecognizerCallback(void* ctxt, BNBinaryView*
}
+Ref<BinaryView> BinaryViewType::Parse(BinaryView* data)
+{
+ Ref<BinaryView> viewRef;
+
+ // Create ephemeral BinaryView to generate information for preview
+ if (data && (GetName() != data->GetTypeName()))
+ {
+ viewRef = Create(data);
+ if (!viewRef || !viewRef->Init())
+ LogError("View type '%s' could not be created", GetName().c_str());
+ }
+
+ return viewRef;
+}
+
+
+Ref<Settings> BinaryViewType::GetLoadSettingsForData(BinaryView* data)
+{
+ return GetDefaultLoadSettingsForData(data);
+}
+
+
+Ref<Settings> BinaryViewType::GetDefaultLoadSettingsForData(BinaryView* data)
+{
+ BNSettings* settings = BNGetBinaryViewDefaultLoadSettingsForData(m_object, data->GetObject());
+ if (!settings)
+ return nullptr;
+ return new Settings(settings);
+}
+
+
CoreBinaryViewType::CoreBinaryViewType(BNBinaryViewType* type) : BinaryViewType(type) {}
-BinaryView* CoreBinaryViewType::Create(BinaryView* data)
+Ref<BinaryView> CoreBinaryViewType::Create(BinaryView* data)
{
BNBinaryView* view = BNCreateBinaryViewOfType(m_object, data->GetObject());
if (!view)
@@ -295,7 +326,7 @@ BinaryView* CoreBinaryViewType::Create(BinaryView* data)
}
-BinaryView* CoreBinaryViewType::Parse(BinaryView* data)
+Ref<BinaryView> CoreBinaryViewType::Parse(BinaryView* data)
{
BNBinaryView* view = BNParseBinaryViewOfType(m_object, data->GetObject());
if (!view)
@@ -310,6 +341,12 @@ bool CoreBinaryViewType::IsTypeValidForData(BinaryView* data)
}
+bool CoreBinaryViewType::IsDeprecated()
+{
+ return BNIsBinaryViewTypeDeprecated(m_object);
+}
+
+
Ref<Settings> CoreBinaryViewType::GetLoadSettingsForData(BinaryView* data)
{
BNSettings* settings = BNGetBinaryViewLoadSettingsForData(m_object, data->GetObject());