summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrandon Miller <brandon@vector35.com>2025-09-26 08:33:48 -0400
committerBrandon Miller <brandon@vector35.com>2025-09-29 07:07:41 -0400
commitdf599006c0a805dda992910722ac69a9adf794fc (patch)
tree4d6b9643febf2d9d5f259d2d827846a13addec7a
parent9a9d7d98c2b49c734771397a8d37aca0279dfa21 (diff)
Fix Rust LowLevelILFunction owner function method
LowLevelILFunction objects can be constructed without a owner function. BNGetLowLevelILOwnerFunction can return NULL and must be checked before creating a Function object.
-rw-r--r--plugins/warp/src/plugin/ffi.rs10
-rw-r--r--plugins/warp/src/plugin/render_layer.rs6
-rw-r--r--rust/src/low_level_il/function.rs10
3 files changed, 20 insertions, 6 deletions
diff --git a/plugins/warp/src/plugin/ffi.rs b/plugins/warp/src/plugin/ffi.rs
index c3a8051c..2826ed34 100644
--- a/plugins/warp/src/plugin/ffi.rs
+++ b/plugins/warp/src/plugin/ffi.rs
@@ -142,7 +142,10 @@ pub unsafe extern "C" fn BNWARPIsLiftedInstructionVariant(
unsafe { LowLevelILFunction::from_raw(analysis_function) };
match lifted_il.instruction_from_index(index) {
Some(instr) => {
- let relocatable_regions = relocatable_regions(&lifted_il.function().view());
+ let Some(owner_function) = lifted_il.function() else {
+ return false;
+ };
+ let relocatable_regions = relocatable_regions(&owner_function.view());
is_variant_instruction(&relocatable_regions, &instr)
}
None => false,
@@ -158,7 +161,10 @@ pub unsafe extern "C" fn BNWARPIsLowLevelInstructionComputedVariant(
unsafe { LowLevelILFunction::from_raw(analysis_function) };
match llil.instruction_from_index(index) {
Some(instr) => {
- let relocatable_regions = relocatable_regions(&llil.function().view());
+ let Some(owner_function) = llil.function() else {
+ return false;
+ };
+ let relocatable_regions = relocatable_regions(&owner_function.view());
is_computed_variant_instruction(&relocatable_regions, &instr)
}
None => false,
diff --git a/plugins/warp/src/plugin/render_layer.rs b/plugins/warp/src/plugin/render_layer.rs
index 6c446e6f..3417c9b1 100644
--- a/plugins/warp/src/plugin/render_layer.rs
+++ b/plugins/warp/src/plugin/render_layer.rs
@@ -48,7 +48,11 @@ impl HighlightRenderLayer {
llil: &LowLevelILRegularFunction,
lines: &mut [DisassemblyTextLine],
) {
- let relocatable_regions = relocatable_regions(&lifted_il.function().view());
+ let Some(owner_function) = lifted_il.function() else {
+ return;
+ };
+
+ let relocatable_regions = relocatable_regions(&owner_function.view());
for line in lines {
// We use address here instead of index since it's more reliable for other IL's.
for lifted_il_instr in filtered_instructions_at(lifted_il, line.address) {
diff --git a/rust/src/low_level_il/function.rs b/rust/src/low_level_il/function.rs
index 65c3536a..ca6508c9 100644
--- a/rust/src/low_level_il/function.rs
+++ b/rust/src/low_level_il/function.rs
@@ -88,8 +88,9 @@ where
}
pub(crate) fn arch(&self) -> CoreArchitecture {
+ // TODO: self.function() can return None under rare circumstances
match self.arch {
- None => self.function().arch(),
+ None => self.function().unwrap().arch(),
Some(arch) => arch,
}
}
@@ -167,10 +168,13 @@ where
}
}
- pub fn function(&self) -> Ref<Function> {
+ pub fn function(&self) -> Option<Ref<Function>> {
unsafe {
let func = BNGetLowLevelILOwnerFunction(self.handle);
- Function::ref_from_raw(func)
+ if func.is_null() {
+ return None;
+ }
+ Some(Function::ref_from_raw(func))
}
}