diff options
| author | Rusty Wagner <rusty.wagner@gmail.com> | 2023-01-24 18:38:13 -0700 |
|---|---|---|
| committer | Rusty Wagner <rusty.wagner@gmail.com> | 2023-01-30 11:57:43 -0500 |
| commit | a3939bdec15f9299ae9a681255fa93c47113870a (patch) | |
| tree | 2b4bb5643ac3cd25a618a99a542968fe81c66bcc /rust/src | |
| parent | cf4220570c2d1b7105fb29719383f64026d46837 (diff) | |
Fix UAF on C++ BinaryView plugin init, improve demangler and BinaryView APIs
Diffstat (limited to 'rust/src')
| -rw-r--r-- | rust/src/binaryview.rs | 45 | ||||
| -rw-r--r-- | rust/src/lib.rs | 16 |
2 files changed, 59 insertions, 2 deletions
diff --git a/rust/src/binaryview.rs b/rust/src/binaryview.rs index 26b0bae2..aab920d2 100644 --- a/rust/src/binaryview.rs +++ b/rust/src/binaryview.rs @@ -622,9 +622,50 @@ pub trait BinaryViewExt: BinaryViewBase { } } - fn add_auto_function(&self, plat: &Platform, addr: u64) { + fn add_auto_function(&self, plat: &Platform, addr: u64) -> Option<Ref<Function>> { unsafe { - BNAddFunctionForAnalysis(self.as_ref().handle, plat.handle, addr); + let handle = BNAddFunctionForAnalysis( + self.as_ref().handle, + plat.handle, + addr, + false, + ptr::null_mut(), + ); + + if handle.is_null() { + return None; + } + + Some(Function::from_raw(handle)) + } + } + + fn add_function_with_type( + &self, + plat: &Platform, + addr: u64, + auto_discovered: bool, + func_type: Option<&Type>, + ) -> Option<Ref<Function>> { + unsafe { + let func_type = match func_type { + Some(func_type) => func_type.handle, + None => ptr::null_mut(), + }; + + let handle = BNAddFunctionForAnalysis( + self.as_ref().handle, + plat.handle, + addr, + auto_discovered, + func_type, + ); + + if handle.is_null() { + return None; + } + + Some(Function::from_raw(handle)) } } diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 5fbb8239..57b71cba 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -528,6 +528,22 @@ pub fn plugin_ui_abi_minimum_version() -> u32 { binaryninjacore_sys::BN_MINIMUM_UI_ABI_VERSION } +pub fn add_required_plugin_dependency<S: string::BnStrCompatible>(name: S) { + unsafe { + binaryninjacore_sys::BNAddRequiredPluginDependency( + name.into_bytes_with_nul().as_ref().as_ptr() as *const std::os::raw::c_char, + ) + }; +} + +pub fn add_optional_plugin_dependency<S: string::BnStrCompatible>(name: S) { + unsafe { + binaryninjacore_sys::BNAddOptionalPluginDependency( + name.into_bytes_with_nul().as_ref().as_ptr() as *const std::os::raw::c_char, + ) + }; +} + // Provide ABI version automatically so that the core can verify binary compatibility #[no_mangle] #[allow(non_snake_case)] |
