diff options
| author | Josh Ferrell <josh@vector35.com> | 2025-05-26 14:57:41 -0400 |
|---|---|---|
| committer | Josh Ferrell <josh@vector35.com> | 2025-05-26 14:57:41 -0400 |
| commit | 05a62897368a49680470bf1ff1da5336a1ed1f6d (patch) | |
| tree | 4130ed5fc4b01e1e087a2ba191c82d22171f9b1f /plugins | |
| parent | f3c7443839a69bdb49b8313e6eef7a3834feb85f (diff) | |
Fix crash when exporting DWARF fails
Diffstat (limited to 'plugins')
| -rw-r--r-- | plugins/dwarf/dwarf_export/src/lib.rs | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/plugins/dwarf/dwarf_export/src/lib.rs b/plugins/dwarf/dwarf_export/src/lib.rs index 283a60ab..539c31a6 100644 --- a/plugins/dwarf/dwarf_export/src/lib.rs +++ b/plugins/dwarf/dwarf_export/src/lib.rs @@ -657,7 +657,7 @@ fn write_dwarf<T: gimli::Endianity>( arch: Architecture, endian: T, dwarf: &mut DwarfUnit, -) { +) -> Result<(), String> { // TODO : Look in to other options (mangling, flags, etc (see Object::new)) let mut out_object = write::Object::new( BinaryFormat::Elf, @@ -671,7 +671,7 @@ fn write_dwarf<T: gimli::Endianity>( // Finally, write the DWARF data to the sections. let mut sections = Sections::new(EndianVec::new(endian)); - dwarf.write(&mut sections).unwrap(); + dwarf.write(&mut sections).map_err(|e| e.to_string())?; sections .for_each(|input_id, input_data| { @@ -685,15 +685,14 @@ fn write_dwarf<T: gimli::Endianity>( // Write data to section in output object let out_section = out_object.section_mut(output_id); if out_section.is_bss() { - panic!("Please report this as a bug: output section is bss"); + return Err("Please report this as a bug: output section is bss".to_string()); } else { out_section.set_data(input_data.clone().into_vec(), 1); } // out_section.flags = in_section.flags(); // TODO - Ok::<(), ()>(()) - }) - .unwrap(); + Ok(()) + })?; if let Ok(out_data) = out_object.write() { if let Err(err) = fs::write(file_path, out_data) { @@ -704,6 +703,8 @@ fn write_dwarf<T: gimli::Endianity>( } else { error!("Failed to write DWARF with requested settings"); } + + Ok(()) } fn export_dwarf(bv: &BinaryView) { @@ -771,11 +772,14 @@ fn export_dwarf(bv: &BinaryView) { // TODO: Export all symbols instead of just data vars? // TODO: Sections? Segments? - if bv.default_endianness() == binaryninja::Endianness::LittleEndian { - write_dwarf(&save_loc_path, arch, gimli::LittleEndian, &mut dwarf); - } else { - write_dwarf(&save_loc_path, arch, gimli::BigEndian, &mut dwarf); + let endianness = match bv.default_endianness() { + binaryninja::Endianness::LittleEndian => gimli::RunTimeEndian::Little, + binaryninja::Endianness::BigEndian => gimli::RunTimeEndian::Big, }; + + if let Err(e) = write_dwarf(&save_loc_path, arch, endianness, &mut dwarf) { + error!("Error writing DWARF: {}", e); + } } struct MyCommand; |
