diff options
| author | Mason Reed <mason@vector35.com> | 2025-02-02 17:07:08 -0500 |
|---|---|---|
| committer | Mason Reed <mason@vector35.com> | 2025-02-02 17:07:08 -0500 |
| commit | 55435dce04863ec488f649279a43ddc2b01594ad (patch) | |
| tree | 13324f7a5114e74d3a1a2a435e9fb3f7692bf938 | |
| parent | 48cec427b50c42af803a25d4511c4d8d94b54e3e (diff) | |
Fix crash in dwarf import when no constant value attribute found for enumeration
Fixes #6382
| -rw-r--r-- | plugins/dwarf/dwarf_import/src/die_handlers.rs | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/plugins/dwarf/dwarf_import/src/die_handlers.rs b/plugins/dwarf/dwarf_import/src/die_handlers.rs index d09645ae..4d013092 100644 --- a/plugins/dwarf/dwarf_import/src/die_handlers.rs +++ b/plugins/dwarf/dwarf_import/src/die_handlers.rs @@ -111,16 +111,23 @@ pub(crate) fn handle_enum<R: ReaderType>( while let Ok(Some(child)) = children.next() { if child.entry().tag() == constants::DW_TAG_enumerator { let name = debug_info_builder_context.get_name(dwarf, unit, child.entry())?; - let attr = &child - .entry() - .attr(constants::DW_AT_const_value) - .unwrap() - .unwrap(); - if let Some(value) = get_attr_as_u64(attr) { - enumeration_builder.insert(name, value); - } else { - log::error!("Unhandled enum member value type - please report this"); - return None; + match &child.entry().attr(constants::DW_AT_const_value) { + Ok(Some(attr)) => { + if let Some(value) = get_attr_as_u64(attr) { + enumeration_builder.insert(name, value); + } else { + // Somehow the child entry is not a const value. + log::error!("Unhandled enum member value type for `{}`", name); + } + } + Ok(None) => { + // Somehow the child entry does not have a const value. + log::error!("Enum member `{}` has no constant value attribute", name); + } + Err(e) => { + log::error!("Error parsing next attribute entry for `{}`: {}", name, e); + return None; + } } } } @@ -133,7 +140,7 @@ pub(crate) fn handle_enum<R: ReaderType>( Some(Type::enumeration( &enumeration_builder.finalize(), // TODO: This looks bad, look at the comment in [`Type::width`]. - width.try_into().unwrap(), + width.try_into().expect("Enum cannot be zero width"), false, )) } |
