summaryrefslogtreecommitdiff
path: root/rust/src
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 /rust/src
parentcf4220570c2d1b7105fb29719383f64026d46837 (diff)
Fix UAF on C++ BinaryView plugin init, improve demangler and BinaryView APIs
Diffstat (limited to 'rust/src')
-rw-r--r--rust/src/binaryview.rs45
-rw-r--r--rust/src/lib.rs16
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)]