diff options
| author | KyleMiles <krm504@nyu.edu> | 2023-08-23 18:08:23 -0400 |
|---|---|---|
| committer | KyleMiles <krm504@nyu.edu> | 2023-08-25 11:18:39 -0400 |
| commit | c618591f29b35017802fef7a5209fd3b9dbfac30 (patch) | |
| tree | 1dfed643650b90c1c6c48abf4763101768883e85 /rust/examples | |
| parent | c0c145ff7286d99edbd4b367bca4e228cae1a3ac (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.rs | 21 | ||||
| -rw-r--r-- | rust/examples/dwarf/dwarf_import/src/dwarfdebuginfo.rs | 4 |
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(), ¶meters, 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 |
