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/dwarf/dwarf_import/src/die_handlers.rs | |
| parent | c0c145ff7286d99edbd4b367bca4e228cae1a3ac (diff) | |
DWARF Import : Fix crash on recursively defined function type that contains itself as a parameter
Diffstat (limited to 'rust/examples/dwarf/dwarf_import/src/die_handlers.rs')
| -rw-r--r-- | rust/examples/dwarf/dwarf_import/src/die_handlers.rs | 21 |
1 files changed, 21 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, |
