diff options
| author | Rusty Wagner <rusty.wagner@gmail.com> | 2016-01-31 02:38:32 -0500 |
|---|---|---|
| committer | Rusty Wagner <rusty.wagner@gmail.com> | 2016-01-31 02:38:32 -0500 |
| commit | a48ce3f4aa1266d5b8619cf320a703ba4f697854 (patch) | |
| tree | b8312cccc35b75b51e0b0e99519460c3e9c2240c /callingconvention.cpp | |
| parent | bbb74ee011e2b482e1895a513203c11affbac229 (diff) | |
Refactor API to fix design bug that causes use-after-free on many plugin objects
Diffstat (limited to 'callingconvention.cpp')
| -rw-r--r-- | callingconvention.cpp | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/callingconvention.cpp b/callingconvention.cpp index 076536c9..c87b3aeb 100644 --- a/callingconvention.cpp +++ b/callingconvention.cpp @@ -4,8 +4,9 @@ using namespace std; using namespace BinaryNinja; -CallingConvention::CallingConvention(BNCallingConvention* cc): m_callingConvention(cc) +CallingConvention::CallingConvention(BNCallingConvention* cc) { + m_object = cc; } @@ -13,6 +14,7 @@ CallingConvention::CallingConvention(Architecture* arch, const string& name) { BNCustomCallingConvention cc; cc.context = this; + cc.freeObject = FreeCallback; cc.getCallerSavedRegisters = GetCallerSavedRegistersCallback; cc.getIntegerArgumentRegisters = GetIntegerArgumentRegistersCallback; cc.getFloatArgumentRegisters = GetFloatArgumentRegistersCallback; @@ -23,13 +25,15 @@ CallingConvention::CallingConvention(Architecture* arch, const string& name) cc.getHighIntegerReturnValueRegister = GetHighIntegerReturnValueRegisterCallback; cc.getFloatReturnValueRegister = GetFloatReturnValueRegisterCallback; - m_callingConvention = BNCreateCallingConvention(arch->GetArchitectureObject(), name.c_str(), &cc); + AddRefForRegistration(); + m_object = BNCreateCallingConvention(arch->GetObject(), name.c_str(), &cc); } -CallingConvention::~CallingConvention() +void CallingConvention::FreeCallback(void* ctxt) { - BNFreeCallingConvention(m_callingConvention); + CallingConvention* cc = (CallingConvention*)ctxt; + cc->ReleaseForRegistration(); } @@ -115,13 +119,13 @@ uint32_t CallingConvention::GetFloatReturnValueRegisterCallback(void* ctxt) Ref<Architecture> CallingConvention::GetArchitecture() const { - return new CoreArchitecture(BNGetCallingConventionArchitecture(m_callingConvention)); + return new CoreArchitecture(BNGetCallingConventionArchitecture(m_object)); } string CallingConvention::GetName() const { - char* str = BNGetCallingConventionName(m_callingConvention); + char* str = BNGetCallingConventionName(m_object); string result = str; BNFreeString(str); return result; @@ -178,7 +182,7 @@ CoreCallingConvention::CoreCallingConvention(BNCallingConvention* cc): CallingCo vector<uint32_t> CoreCallingConvention::GetCallerSavedRegisters() { size_t count; - uint32_t* regs = BNGetCallerSavedRegisters(m_callingConvention, &count); + uint32_t* regs = BNGetCallerSavedRegisters(m_object, &count); vector<uint32_t> result; result.insert(result.end(), regs, ®s[count]); BNFreeRegisterList(regs); @@ -189,7 +193,7 @@ vector<uint32_t> CoreCallingConvention::GetCallerSavedRegisters() vector<uint32_t> CoreCallingConvention::GetIntegerArgumentRegisters() { size_t count; - uint32_t* regs = BNGetIntegerArgumentRegisters(m_callingConvention, &count); + uint32_t* regs = BNGetIntegerArgumentRegisters(m_object, &count); vector<uint32_t> result; result.insert(result.end(), regs, ®s[count]); BNFreeRegisterList(regs); @@ -200,7 +204,7 @@ vector<uint32_t> CoreCallingConvention::GetIntegerArgumentRegisters() vector<uint32_t> CoreCallingConvention::GetFloatArgumentRegisters() { size_t count; - uint32_t* regs = BNGetFloatArgumentRegisters(m_callingConvention, &count); + uint32_t* regs = BNGetFloatArgumentRegisters(m_object, &count); vector<uint32_t> result; result.insert(result.end(), regs, ®s[count]); BNFreeRegisterList(regs); @@ -210,29 +214,29 @@ vector<uint32_t> CoreCallingConvention::GetFloatArgumentRegisters() bool CoreCallingConvention::AreArgumentRegistersSharedIndex() { - return BNAreArgumentRegistersSharedIndex(m_callingConvention); + return BNAreArgumentRegistersSharedIndex(m_object); } bool CoreCallingConvention::IsStackReservedForArgumentRegisters() { - return BNIsStackReservedForArgumentRegisters(m_callingConvention); + return BNIsStackReservedForArgumentRegisters(m_object); } uint32_t CoreCallingConvention::GetIntegerReturnValueRegister() { - return BNGetIntegerReturnValueRegister(m_callingConvention); + return BNGetIntegerReturnValueRegister(m_object); } uint32_t CoreCallingConvention::GetHighIntegerReturnValueRegister() { - return BNGetHighIntegerReturnValueRegister(m_callingConvention); + return BNGetHighIntegerReturnValueRegister(m_object); } uint32_t CoreCallingConvention::GetFloatReturnValueRegister() { - return BNGetFloatReturnValueRegister(m_callingConvention); + return BNGetFloatReturnValueRegister(m_object); } |
