From fe9e37f6fc5a632bc022a3329b80c7ddd7afc499 Mon Sep 17 00:00:00 2001 From: KyleMiles Date: Wed, 25 Oct 2023 14:46:54 -0400 Subject: DWARF Import : Better detection and handling of malformed DWARF info; Resolves #4682 --- rust/examples/dwarf/dwarf_import/src/lib.rs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'rust/examples') diff --git a/rust/examples/dwarf/dwarf_import/src/lib.rs b/rust/examples/dwarf/dwarf_import/src/lib.rs index 7aab3775..4046e022 100644 --- a/rust/examples/dwarf/dwarf_import/src/lib.rs +++ b/rust/examples/dwarf/dwarf_import/src/lib.rs @@ -35,13 +35,13 @@ use dwarfreader::{ use gimli::{constants, DebuggingInformationEntry, Dwarf, DwarfFileType, Reader, SectionId, Unit}; -use log::{warn, LevelFilter}; +use log::{error, warn, LevelFilter}; use std::ffi::CString; fn recover_names>( debug_info_builder_context: &mut DebugInfoBuilderContext, progress: &dyn Fn(usize, usize) -> Result<(), ()>, -) { +) -> bool { let mut iter = debug_info_builder_context.dwarf().units(); while let Ok(Some(header)) = iter.next() { let unit = debug_info_builder_context.dwarf().unit(header).unwrap(); @@ -59,11 +59,14 @@ fn recover_names>( debug_info_builder_context.total_die_count += 1; if (*progress)(0, debug_info_builder_context.total_die_count).is_err() { - return; // Parsing canceled + return false; // Parsing canceled }; depth += delta_depth; - assert!(depth >= 0); + if depth < 0 { + error!("DWARF information is seriously malformed. Aborting parsing."); + return false; + } // TODO : Better module/component support namespace_qualifiers.retain(|&(entry_depth, _)| entry_depth < depth); @@ -180,6 +183,8 @@ fn recover_names>( } } } + + true } fn parse_unit>( @@ -247,8 +252,9 @@ fn parse_dwarf( // so we just do it up front let mut debug_info_builder = DebugInfoBuilder::new(); if let Some(mut debug_info_builder_context) = DebugInfoBuilderContext::new(view, dwarf) { - recover_names(&mut debug_info_builder_context, &progress); - if debug_info_builder_context.total_die_count == 0 { + if !recover_names(&mut debug_info_builder_context, &progress) + || debug_info_builder_context.total_die_count == 0 + { return debug_info_builder; } -- cgit v1.3.1