[PATCH] D85739: [DebugInfo] Avoid falling in an infinite loop with a truncated .debug_str_offsets.dwo.

Igor Kudrin via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 13 23:14:35 PDT 2020


This revision was automatically updated to reflect the committed changes.
Closed by commit rG95fad44e34c3: [DebugInfo] Avoid an infinite loop with a truncated pre-v5 .debug_str_offsets. (authored by ikudrin).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D85739/new/

https://reviews.llvm.org/D85739

Files:
  llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp
  llvm/test/DebugInfo/X86/dwarfdump-str-offsets-v4-invalid.s


Index: llvm/test/DebugInfo/X86/dwarfdump-str-offsets-v4-invalid.s
===================================================================
--- /dev/null
+++ llvm/test/DebugInfo/X86/dwarfdump-str-offsets-v4-invalid.s
@@ -0,0 +1,65 @@
+## This tests handling invalid .debug_str_offsets.dwo sections in
+## a pre-standard DWO/DWP file.
+
+# RUN: llvm-mc -triple x86_64 %s -filetype=obj -o %t.dwo
+# RUN: not llvm-dwarfdump -v %t.dwo 2>&1 | FileCheck %s
+
+# RUN: llvm-mc -triple x86_64 %s -filetype=obj -o %t.dwp --defsym DWP=0
+# RUN: not llvm-dwarfdump -v %t.dwp 2>&1 | FileCheck %s
+
+# CHECK: error: invalid reference to or invalid content in .debug_str_offsets[.dwo]: length exceeds section size
+
+    .section .debug_abbrev.dwo,"e", at progbits
+.LAbbr:
+    .byte 0x01  # Abbrev code
+    .byte 0x11  # DW_TAG_compile_unit
+    .byte 0x00  # DW_CHILDREN_no
+    .byte 0x00  # EOM(1)
+    .byte 0x00  # EOM(2)
+    .byte 0x00  # EOM(3)
+.LAbbrEnd:
+
+    .section .debug_info.dwo,"e", at progbits
+.LCU:
+    .long .LCUEnd-.LCUVersion
+.LCUVersion:
+    .short 4
+    .long 0
+    .byte 8
+    .uleb128 1
+.LCUEnd:
+
+## The section is truncated, i.e. its size is not a multiple of entry size.
+    .section .debug_str_offsets.dwo,"e", at progbits
+.LStrOff:
+    .byte 0
+.LStrOffEnd:
+
+.ifdef DWP
+    .section .debug_cu_index, "", @progbits
+## Header:
+    .long 2                         # Version
+    .long 3                         # Section count
+    .long 1                         # Unit count
+    .long 2                         # Slot count
+## Hash Table of Signatures:
+    .quad 0x1100001122222222        # DWO Id of CU0
+    .quad 0
+## Parallel Table of Indexes:
+    .long 1
+    .long 0
+## Table of Section Offsets:
+## Row 0:
+    .long 1                         # DW_SECT_INFO
+    .long 3                         # DW_SECT_ABBREV
+    .long 6                         # DW_SECT_STR_OFFSETS
+## Row 1, offsets of the contribution
+    .long .LCU-.debug_info.dwo
+    .long .LAbbr-.debug_abbrev.dwo
+    .long .LStrOff-.debug_str_offsets.dwo
+## Table of Section Sizes:
+## Row 1, sizes of the contribution
+    .long .LCUEnd-.LCU
+    .long .LAbbrEnd-.LAbbr
+    .long .LStrOffEnd-.LStrOff
+.endif
Index: llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp
===================================================================
--- llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp
+++ llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp
@@ -995,11 +995,17 @@
   // Prior to DWARF v5, we derive the contribution size from the
   // index table (in a package file). In a .dwo file it is simply
   // the length of the string offsets section.
-  if (!IndexEntry)
-    return {Optional<StrOffsetsContributionDescriptor>(
-        {0, StringOffsetSection.Data.size(), 4, Header.getFormat()})};
+  StrOffsetsContributionDescriptor Desc;
   if (C)
-    return {Optional<StrOffsetsContributionDescriptor>(
-        {C->Offset, C->Length, 4, Header.getFormat()})};
-  return None;
+    Desc = StrOffsetsContributionDescriptor(C->Offset, C->Length, 4,
+                                            Header.getFormat());
+  else if (!IndexEntry && !StringOffsetSection.Data.empty())
+    Desc = StrOffsetsContributionDescriptor(0, StringOffsetSection.Data.size(),
+                                            4, Header.getFormat());
+  else
+    return None;
+  auto DescOrError = Desc.validateContributionSize(DA);
+  if (!DescOrError)
+    return DescOrError.takeError();
+  return *DescOrError;
 }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D85739.285558.patch
Type: text/x-patch
Size: 3464 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200814/deb91028/attachment.bin>


More information about the llvm-commits mailing list