summaryrefslogtreecommitdiff
path: root/binaryviewtype.cpp
diff options
context:
space:
mode:
authorRusty Wagner <rusty.wagner@gmail.com>2016-01-31 02:38:32 -0500
committerRusty Wagner <rusty.wagner@gmail.com>2016-01-31 02:38:32 -0500
commita48ce3f4aa1266d5b8619cf320a703ba4f697854 (patch)
treeb8312cccc35b75b51e0b0e99519460c3e9c2240c /binaryviewtype.cpp
parentbbb74ee011e2b482e1895a513203c11affbac229 (diff)
Refactor API to fix design bug that causes use-after-free on many plugin objects
Diffstat (limited to 'binaryviewtype.cpp')
-rw-r--r--binaryviewtype.cpp33
1 files changed, 18 insertions, 15 deletions
diff --git a/binaryviewtype.cpp b/binaryviewtype.cpp
index e231586b..f7e1fbc0 100644
--- a/binaryviewtype.cpp
+++ b/binaryviewtype.cpp
@@ -9,7 +9,7 @@ BNBinaryView* BinaryViewType::CreateCallback(void* ctxt, BNBinaryView* data)
BinaryViewType* type = (BinaryViewType*)ctxt;
Ref<BinaryView> view = new BinaryView(BNNewViewReference(data));
Ref<BinaryView> result = type->Create(view);
- return BNNewViewReference(result->GetViewObject());
+ return BNNewViewReference(result->GetObject());
}
@@ -21,14 +21,16 @@ bool BinaryViewType::IsValidCallback(void* ctxt, BNBinaryView* data)
}
-BinaryViewType::BinaryViewType(BNBinaryViewType* type): m_type(type)
+BinaryViewType::BinaryViewType(BNBinaryViewType* type)
{
+ m_object = type;
}
BinaryViewType::BinaryViewType(const string& name, const string& longName):
- m_type(nullptr), m_nameForRegister(name), m_longNameForRegister(longName)
+ m_nameForRegister(name), m_longNameForRegister(longName)
{
+ m_object = nullptr;
}
@@ -39,8 +41,9 @@ void BinaryViewType::Register(BinaryViewType* type)
callbacks.create = CreateCallback;
callbacks.isValidForData = IsValidCallback;
- type->m_type = BNRegisterBinaryViewType(type->m_nameForRegister.c_str(),
- type->m_longNameForRegister.c_str(), &callbacks);
+ type->AddRefForRegistration();
+ type->m_object = BNRegisterBinaryViewType(type->m_nameForRegister.c_str(),
+ type->m_longNameForRegister.c_str(), &callbacks);
}
@@ -72,7 +75,7 @@ vector<Ref<BinaryViewType>> BinaryViewType::GetViewTypesForData(BinaryView* data
{
BNBinaryViewType** types;
size_t count;
- types = BNGetBinaryViewTypesForData(data->GetViewObject(), &count);
+ types = BNGetBinaryViewTypesForData(data->GetObject(), &count);
vector<Ref<BinaryViewType>> result;
for (size_t i = 0; i < count; i++)
@@ -94,13 +97,13 @@ void BinaryViewType::RegisterArchitecture(const string& name, uint32_t id, Archi
void BinaryViewType::RegisterArchitecture(uint32_t id, Architecture* arch)
{
- BNRegisterArchitectureForViewType(m_type, id, arch->GetArchitectureObject());
+ BNRegisterArchitectureForViewType(m_object, id, arch->GetObject());
}
Ref<Architecture> BinaryViewType::GetArchitecture(uint32_t id)
{
- BNArchitecture* arch = BNGetArchitectureForViewType(m_type, id);
+ BNArchitecture* arch = BNGetArchitectureForViewType(m_object, id);
if (!arch)
return nullptr;
return new CoreArchitecture(arch);
@@ -127,19 +130,19 @@ void BinaryViewType::RegisterDefaultPlatform(const string& name, Architecture* a
void BinaryViewType::RegisterPlatform(uint32_t id, Architecture* arch, Platform* platform)
{
- BNRegisterPlatformForViewType(m_type, id, arch->GetArchitectureObject(), platform->GetPlatformObject());
+ BNRegisterPlatformForViewType(m_object, id, arch->GetObject(), platform->GetObject());
}
void BinaryViewType::RegisterDefaultPlatform(Architecture* arch, Platform* platform)
{
- BNRegisterDefaultPlatformForViewType(m_type, arch->GetArchitectureObject(), platform->GetPlatformObject());
+ BNRegisterDefaultPlatformForViewType(m_object, arch->GetObject(), platform->GetObject());
}
Ref<Platform> BinaryViewType::GetPlatform(uint32_t id, Architecture* arch)
{
- BNPlatform* platform = BNGetPlatformForViewType(m_type, id, arch->GetArchitectureObject());
+ BNPlatform* platform = BNGetPlatformForViewType(m_object, id, arch->GetObject());
if (!platform)
return nullptr;
return new Platform(platform);
@@ -148,7 +151,7 @@ Ref<Platform> BinaryViewType::GetPlatform(uint32_t id, Architecture* arch)
string BinaryViewType::GetName()
{
- char* contents = BNGetBinaryViewTypeName(m_type);
+ char* contents = BNGetBinaryViewTypeName(m_object);
string result = contents;
BNFreeString(contents);
return result;
@@ -157,7 +160,7 @@ string BinaryViewType::GetName()
string BinaryViewType::GetLongName()
{
- char* contents = BNGetBinaryViewTypeLongName(m_type);
+ char* contents = BNGetBinaryViewTypeLongName(m_object);
string result = contents;
BNFreeString(contents);
return result;
@@ -171,7 +174,7 @@ CoreBinaryViewType::CoreBinaryViewType(BNBinaryViewType* type): BinaryViewType(t
BinaryView* CoreBinaryViewType::Create(BinaryView* data)
{
- BNBinaryView* view = BNCreateBinaryViewOfType(m_type, data->GetViewObject());
+ BNBinaryView* view = BNCreateBinaryViewOfType(m_object, data->GetObject());
if (!view)
return nullptr;
return new BinaryView(view);
@@ -180,5 +183,5 @@ BinaryView* CoreBinaryViewType::Create(BinaryView* data)
bool CoreBinaryViewType::IsTypeValidForData(BinaryView* data)
{
- return BNIsBinaryViewTypeValidForData(m_type, data->GetViewObject());
+ return BNIsBinaryViewTypeValidForData(m_object, data->GetObject());
}