From f0e9ed4488b00cee222f17b190b0d415019ad17c Mon Sep 17 00:00:00 2001 From: KENZ Date: Sat, 10 Jun 2023 07:20:46 +0900 Subject: [PATCH] Debugger: just skip .debug_frame/.eh_frame section contains a 0-length CIE Some executables (or shared objects) may have .debug_frame or .eh_frame section which contains the CIE(/FDE) length is 0. The DWARF spec doesn't describe this case explicitly, but doesn't prohibit it. LSB says to treat this a terminator of the CIE. https://refspecs.linuxbase.org/LSB_5.0.0/LSB-Core-generic/LSB-Core-generic/ehframechpt.html Previous code failed to load the entire debug info of the executable. New code just skip these section (don't read anymore) after the Debugger (kit) encounter a 0-length CIE. Fixes #18438. Change-Id: I382d0ec409d40570b5bccd384d38fa3c29ae2e7f Reviewed-on: https://review.haiku-os.org/c/haiku/+/6538 Reviewed-by: Rene Gollent Tested-by: Commit checker robot --- src/kits/debugger/dwarf/DwarfFile.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/kits/debugger/dwarf/DwarfFile.cpp b/src/kits/debugger/dwarf/DwarfFile.cpp index e382d6200e..774803af54 100644 --- a/src/kits/debugger/dwarf/DwarfFile.cpp +++ b/src/kits/debugger/dwarf/DwarfFile.cpp @@ -1156,6 +1156,11 @@ DwarfFile::_ParseFrameSection(ElfSection* section, uint8 addressSize, return B_BAD_DATA; off_t lengthOffset = dataReader.Offset(); + // If the length is 0, it means a terminator of the CIE. + // Then just skip this .debug_frame/.eh_frame section. + if (length == 0) + return B_OK; + // CIE ID/CIE pointer uint64 cieID = dwarf64 ? dataReader.Read(0) : dataReader.Read(0);