summaryrefslogtreecommitdiff
path: root/rust/examples
diff options
context:
space:
mode:
authorKyleMiles <krm504@nyu.edu>2023-08-23 18:08:23 -0400
committerKyleMiles <krm504@nyu.edu>2023-08-25 11:18:39 -0400
commitc618591f29b35017802fef7a5209fd3b9dbfac30 (patch)
tree1dfed643650b90c1c6c48abf4763101768883e85 /rust/examples
parentc0c145ff7286d99edbd4b367bca4e228cae1a3ac (diff)
DWARF Import : Fix crash on recursively defined function type that contains itself as a parameter
Diffstat (limited to 'rust/examples')
-rw-r--r--rust/examples/dwarf/dwarf_import/src/die_handlers.rs21
-rw-r--r--rust/examples/dwarf/dwarf_import/src/dwarfdebuginfo.rs4
2 files changed, 25 insertions, 0 deletions
diff --git a/rust/examples/dwarf/dwarf_import/src/die_handlers.rs b/rust/examples/dwarf/dwarf_import/src/die_handlers.rs
index 531dfa3e..84ad8a43 100644
--- a/rust/examples/dwarf/dwarf_import/src/die_handlers.rs
+++ b/rust/examples/dwarf/dwarf_import/src/die_handlers.rs
@@ -304,6 +304,23 @@ pub fn handle_function<R: Reader<Offset = usize>>(
None => Type::void(),
};
+ // Alias function type in the case that it contains itself
+ if let Some(name) = debug_info_builder.get_name(dwarf, unit, entry) {
+ debug_info_builder.add_type(
+ get_uid(unit, entry),
+ name.clone(),
+ Type::named_type_from_type(
+ name,
+ &Type::function::<String, &binaryninja::types::Type>(
+ return_type.as_ref(),
+ &vec![],
+ false,
+ ),
+ ),
+ false,
+ );
+ }
+
let mut parameters: Vec<FunctionParameter<CString>> = vec![];
let mut variable_arguments = false;
@@ -327,6 +344,10 @@ pub fn handle_function<R: Reader<Offset = usize>>(
}
}
+ if debug_info_builder.get_name(dwarf, unit, entry).is_some() {
+ debug_info_builder.remove_type(get_uid(unit, entry));
+ }
+
Some(Type::function(
return_type.as_ref(),
&parameters,
diff --git a/rust/examples/dwarf/dwarf_import/src/dwarfdebuginfo.rs b/rust/examples/dwarf/dwarf_import/src/dwarfdebuginfo.rs
index d4a2794d..b088d527 100644
--- a/rust/examples/dwarf/dwarf_import/src/dwarfdebuginfo.rs
+++ b/rust/examples/dwarf/dwarf_import/src/dwarfdebuginfo.rs
@@ -176,6 +176,10 @@ impl DebugInfoBuilder {
}
}
+ pub fn remove_type(&mut self, type_uid: TypeUID) {
+ self.types.remove(&type_uid);
+ }
+
// TODO : Non-copy?
pub fn get_type(&self, type_uid: TypeUID) -> Option<(CString, Ref<Type>)> {
self.types