diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf4/DWARFCompilationUnit.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf4/DWARFCompilationUnit.java index 2ed1bfde12..0f15dba673 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf4/DWARFCompilationUnit.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf4/DWARFCompilationUnit.java @@ -148,6 +148,7 @@ public class DWARFCompilationUnit { else { format = DWARF_32; } + long endOffset = (debugInfoBR.getPointerIndex() + length); short version = debugInfoBR.readNextShort(); long abbreviationOffset = DWARFUtil.readOffsetByDWARFformat(debugInfoBR, format); @@ -158,6 +159,14 @@ public class DWARFCompilationUnit { throw new DWARFException( "Only DWARF version 2, 3, or 4 information is currently supported."); } + if (firstDIEOffset > endOffset) { + throw new IOException("Invalid length " + (endOffset - startOffset) + + " for DWARF Compilation Unit at 0x" + Long.toHexString(startOffset)); + } + else if (firstDIEOffset == endOffset) { + // silently skip this empty compunit + return null; + } debugAbbrBR.setPointerIndex(abbreviationOffset); Map abbrMap =