diff options
| author | Josh Ferrell <josh@vector35.com> | 2025-10-12 15:58:05 -0400 |
|---|---|---|
| committer | Josh Ferrell <josh@vector35.com> | 2025-10-12 15:58:05 -0400 |
| commit | 49558b88ed5dacaac0bdf1946291bc37a4a88cb9 (patch) | |
| tree | 8a91157664f21f98566c456dbb3f850970ac52dd /plugins/dwarf/dwarf_import/src/helpers.rs | |
| parent | 573b03c844090b53fb49b2156deae7540c8c3059 (diff) | |
Replace calls to unwrap() in dwarf_import
Diffstat (limited to 'plugins/dwarf/dwarf_import/src/helpers.rs')
| -rw-r--r-- | plugins/dwarf/dwarf_import/src/helpers.rs | 80 |
1 files changed, 51 insertions, 29 deletions
diff --git a/plugins/dwarf/dwarf_import/src/helpers.rs b/plugins/dwarf/dwarf_import/src/helpers.rs index 0ab9ab95..35580ad3 100644 --- a/plugins/dwarf/dwarf_import/src/helpers.rs +++ b/plugins/dwarf/dwarf_import/src/helpers.rs @@ -110,11 +110,14 @@ pub(crate) fn get_attr_die<'a, R: ReaderType>( Ok(Some(DebugInfoRefSup(offset))) => { for source_unit in debug_info_builder_context.sup_units() { if let Some(new_offset) = offset.to_unit_offset(&source_unit.header) { - return Some(DieReference::UnitAndOffset(( - dwarf.sup().unwrap(), - source_unit, - new_offset, - ))); + let sup: &Dwarf<R> = match dwarf.sup() { + Some(x) => x, + None => { + log::error!("Trying to get offset in supplmentary dwarf info, but none is present"); + return None; + } + }; + return Some(DieReference::UnitAndOffset((sup, source_unit, new_offset))); } } warn!("Failed to fetch DIE. Supplementary debug information may be incomplete."); @@ -185,11 +188,18 @@ pub(crate) fn get_name<R: ReaderType>( ) -> Option<String> { match resolve_specification(dwarf, unit, entry, debug_info_builder_context) { DieReference::UnitAndOffset((dwarf, entry_unit, entry_offset)) => { - if let Ok(Some(attr_val)) = entry_unit - .entry(entry_offset) - .unwrap() - .attr_value(constants::DW_AT_name) - { + let resolved_entry = match entry_unit.entry(entry_offset) { + Ok(x) => x, + Err(_) => { + log::error!( + "Failed to get entry in unit at {:?} at offset {:#x} (get_name)", + entry_unit.header.offset(), + entry_offset.0 + ); + return None; + } + }; + if let Ok(Some(attr_val)) = resolved_entry.attr_value(constants::DW_AT_name) { if let Ok(attr_string) = dwarf.attr_string(entry_unit, attr_val.clone()) { if let Ok(attr_string) = attr_string.to_string() { return Some(attr_string.to_string()); @@ -225,11 +235,19 @@ pub(crate) fn get_raw_name<R: ReaderType>( ) -> Option<String> { match resolve_specification(dwarf, unit, entry, debug_info_builder_context) { DieReference::UnitAndOffset((dwarf, entry_unit, entry_offset)) => { - if let Ok(Some(attr_val)) = entry_unit - .entry(entry_offset) - .unwrap() - .attr_value(constants::DW_AT_linkage_name) - { + let resolved_entry = match entry_unit.entry(entry_offset) { + Ok(x) => x, + Err(_) => { + log::error!( + "Failed to get entry in unit at {:?} at offset {:#x} (get_raw_name)", + entry_unit.header.offset(), + entry_offset.0 + ); + return None; + } + }; + + if let Ok(Some(attr_val)) = resolved_entry.attr_value(constants::DW_AT_linkage_name) { if let Ok(attr_string) = dwarf.attr_string(entry_unit, attr_val.clone()) { if let Ok(attr_string) = attr_string.to_string() { return Some(attr_string.to_string()); @@ -379,22 +397,26 @@ pub(crate) fn get_build_id(view: &BinaryView) -> Result<String, String> { return Err("Build id section must be at least 12 bytes".to_string()); } - let name_len: u32; - let desc_len: u32; - let note_type: u32; - match raw_view.default_endianness() { - Endianness::LittleEndian => { - name_len = u32::from_le_bytes(build_id_bytes[0..4].try_into().unwrap()); - desc_len = u32::from_le_bytes(build_id_bytes[4..8].try_into().unwrap()); - note_type = u32::from_le_bytes(build_id_bytes[8..12].try_into().unwrap()); - } - Endianness::BigEndian => { - name_len = u32::from_be_bytes(build_id_bytes[0..4].try_into().unwrap()); - desc_len = u32::from_be_bytes(build_id_bytes[4..8].try_into().unwrap()); - note_type = u32::from_be_bytes(build_id_bytes[8..12].try_into().unwrap()); - } + let conversion_func = match raw_view.default_endianness() { + Endianness::LittleEndian => u32::from_le_bytes, + Endianness::BigEndian => u32::from_be_bytes, }; + let name_len = build_id_bytes[0..4] + .try_into() + .map_err(|e| format!("Failed to get name length: {}", e)) + .map(|byte_val| conversion_func(byte_val))?; + + let desc_len = build_id_bytes[4..8] + .try_into() + .map_err(|e| format!("Failed to get desc length: {}", e)) + .map(|byte_val| conversion_func(byte_val))?; + + let note_type = build_id_bytes[8..12] + .try_into() + .map_err(|e| format!("Failed to get note type: {}", e)) + .map(|byte_val| conversion_func(byte_val))?; + if note_type != 3 { return Err(format!("Build id section has wrong type: {}", note_type)); } |
