<div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Thu, Dec 28, 2017 at 8:56 AM Jonas Devlieghere via Phabricator via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">JDevlieghere created this revision.<br>
JDevlieghere added reviewers: probinson, aprantl.<br>
JDevlieghere added a project: debug-info.<br>
<br>
This patch replaces an assertion with an explicit check for the validity<br>
of the FORM parameters. The assertion was triggered when the DWARFv5<br>
line table contained a zero address size.<br>
<br>
This fixes OSS-Fuzz Issue 4644<br>
<a href="https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=4644" rel="noreferrer" target="_blank">https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=4644</a><br>
<br>
<br>
Repository:<br>
  rL LLVM<br>
<br>
<a href="https://reviews.llvm.org/D41615" rel="noreferrer" target="_blank">https://reviews.llvm.org/D41615</a><br>
<br>
Files:<br>
  include/llvm/DebugInfo/DWARF/DWARFFormValue.h<br>
  lib/DebugInfo/DWARF/DWARFDebugLine.cpp<br>
  lib/DebugInfo/DWARF/DWARFFormValue.cpp<br>
  test/DebugInfo/Inputs/invalid.linetable<br>
  test/DebugInfo/dwarfdump-invalid-line-table.test<br>
<br>
<br>
Index: test/DebugInfo/dwarfdump-invalid-line-table.test<br>
===================================================================<br>
--- /dev/null<br>
+++ test/DebugInfo/dwarfdump-invalid-line-table.test<br>
@@ -0,0 +1,5 @@<br>
+Verify that dwarfdump doesn't crash on invalid line table prologue.<br>
+OSS-Fuzz Issue 4644 (<a href="https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=4644" rel="noreferrer" target="_blank">https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=4644</a>)<br>
+<br>
+RUN: llvm-dwarfdump --verbose %p/Inputs/invalid.linetable 2>&1 | FileCheck %s --check-prefix=INVALID-LINE-TABLE<br>
+INVALID-LINE-TABLE: invalid directory or file table description<br>
Index: lib/DebugInfo/DWARF/DWARFFormValue.cpp<br>
===================================================================<br>
--- lib/DebugInfo/DWARF/DWARFFormValue.cpp<br>
+++ lib/DebugInfo/DWARF/DWARFFormValue.cpp<br>
@@ -64,8 +64,10 @@<br>
                                  const DWARFFormParams Params) {<br>
   switch (Form) {<br>
   case DW_FORM_addr:<br>
-    assert(Params.Version && Params.AddrSize && "Invalid Params for form");<br>
-    return Params.AddrSize;<br>
+    if (Params)<br>
+      return Params.AddrSize;<br>
+    else<br>
+      return None;<br></blockquote><div><br>Don't use else after return (instead use:<br>  if (x)</div><div>    return y;<br>  return z;<br>)<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
   case DW_FORM_block:          // ULEB128 length L followed by L bytes.<br>
   case DW_FORM_block1:         // 1 byte length L followed by L bytes.<br>
@@ -86,8 +88,10 @@<br>
     return None;<br>
<br>
   case DW_FORM_ref_addr:<br>
-    assert(Params.Version && Params.AddrSize && "Invalid Params for form");<br>
-    return Params.getRefAddrByteSize();<br>
+    if (Params)<br>
+      return Params.getRefAddrByteSize();<br>
+    else<br>
+      return None;<br>
<br>
   case DW_FORM_flag:<br>
   case DW_FORM_data1:<br>
@@ -118,8 +122,10 @@<br>
   case DW_FORM_line_strp:<br>
   case DW_FORM_sec_offset:<br>
   case DW_FORM_strp_sup:<br>
-    assert(Params.Version && Params.AddrSize && "Invalid Params for form");<br>
-    return Params.getDwarfOffsetByteSize();<br>
+    if (Params)<br>
+      return Params.getDwarfOffsetByteSize();<br>
+    else<br>
+      return None;<br>
<br>
   case DW_FORM_data8:<br>
   case DW_FORM_ref8:<br>
Index: lib/DebugInfo/DWARF/DWARFDebugLine.cpp<br>
===================================================================<br>
--- lib/DebugInfo/DWARF/DWARFDebugLine.cpp<br>
+++ lib/DebugInfo/DWARF/DWARFDebugLine.cpp<br>
@@ -268,7 +268,7 @@<br>
<br>
   if (getVersion() >= 5) {<br>
     if (!parseV5DirFileTables(DebugLineData, OffsetPtr, EndPrologueOffset,<br>
-                              getFormParams(), U, HasMD5, IncludeDirectories,<br>
+                              FormParams, U, HasMD5, IncludeDirectories,<br>
                               FileNames)) {<br>
       fprintf(stderr,<br>
               "warning: parsing line table prologue at 0x%8.8" PRIx64<br>
Index: include/llvm/DebugInfo/DWARF/DWARFFormValue.h<br>
===================================================================<br>
--- include/llvm/DebugInfo/DWARF/DWARFFormValue.h<br>
+++ include/llvm/DebugInfo/DWARF/DWARFFormValue.h<br>
@@ -50,6 +50,8 @@<br>
     }<br>
     llvm_unreachable("Invalid Format value");<br>
   }<br>
+<br>
+  explicit operator bool() const { return Version && AddrSize; }<br>
 };<br>
<br>
 class DWARFFormValue {<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div></div>