<div dir="ltr">I think you need `// REQUIRES: zlib` in your test.</div><div class="gmail_extra"><br><div class="gmail_quote">On 5 September 2017 at 12:21, Jonas Devlieghere via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: jdevlieghere<br>
Date: Tue Sep  5 04:21:38 2017<br>
New Revision: 312526<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=312526&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=312526&view=rev</a><br>
Log:<br>
[Decompression] Fail gracefully when out of memory<br>
<br>
This patch adds failing gracefully when running out of memory when<br>
allocating a buffer for decompression.<br>
<br>
This provides a work-around for:<br>
<a href="https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3224" rel="noreferrer" target="_blank">https://bugs.chromium.org/p/<wbr>oss-fuzz/issues/detail?id=3224</a><br>
<br>
Differential revision: <a href="https://reviews.llvm.org/D37447" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D37447</a><br>
<br>
Added:<br>
    llvm/trunk/test/DebugInfo/<wbr>Inputs/dwarfdump-<wbr>decompression-invalid-size.<wbr>elf-x86-64<br>
    llvm/trunk/test/DebugInfo/<wbr>dwarfdump-decompression-<wbr>invalid-size.test<br>
Modified:<br>
    llvm/trunk/include/llvm/<wbr>Object/Decompressor.h<br>
    llvm/trunk/lib/Object/<wbr>Decompressor.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/<wbr>Object/Decompressor.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/Decompressor.h?rev=312526&r1=312525&r2=312526&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/Object/Decompressor.h?<wbr>rev=312526&r1=312525&r2=<wbr>312526&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/<wbr>Object/Decompressor.h (original)<br>
+++ llvm/trunk/include/llvm/<wbr>Object/Decompressor.h Tue Sep  5 04:21:38 2017<br>
@@ -13,6 +13,7 @@<br>
 #include "llvm/ADT/SmallString.h"<br>
 #include "llvm/ADT/StringRef.h"<br>
 #include "llvm/Object/ObjectFile.h"<br>
+#include "llvm/Support/ErrorHandling.h"<br>
<br>
 namespace llvm {<br>
 namespace object {<br>
@@ -31,7 +32,9 @@ public:<br>
   /// @brief Resize the buffer and uncompress section data into it.<br>
   /// @param Out         Destination buffer.<br>
   template <class T> Error resizeAndDecompress(T &Out) {<br>
+    install_bad_alloc_error_<wbr>handler(outOfMemoryHandler, this);<br>
     Out.resize(DecompressedSize);<br>
+    remove_bad_alloc_error_<wbr>handler();<br>
     return decompress({Out.data(), (size_t)DecompressedSize});<br>
   }<br>
<br>
@@ -52,11 +55,14 @@ public:<br>
   static bool isGnuStyle(StringRef Name);<br>
<br>
 private:<br>
-  Decompressor(StringRef Data);<br>
+  static void outOfMemoryHandler(void *Data, const std::string &Message, bool);<br>
+<br>
+  Decompressor(StringRef Name, StringRef Data);<br>
<br>
   Error consumeCompressedGnuHeader();<br>
   Error consumeCompressedZLibHeader(<wbr>bool Is64Bit, bool IsLittleEndian);<br>
<br>
+  StringRef SectionName;<br>
   StringRef SectionData;<br>
   uint64_t DecompressedSize;<br>
 };<br>
<br>
Modified: llvm/trunk/lib/Object/<wbr>Decompressor.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/Decompressor.cpp?rev=312526&r1=312525&r2=312526&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/Object/<wbr>Decompressor.cpp?rev=312526&<wbr>r1=312525&r2=312526&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Object/<wbr>Decompressor.cpp (original)<br>
+++ llvm/trunk/lib/Object/<wbr>Decompressor.cpp Tue Sep  5 04:21:38 2017<br>
@@ -23,7 +23,7 @@ Expected<Decompressor> Decompressor::cre<br>
   if (!zlib::isAvailable())<br>
     return createError("zlib is not available");<br>
<br>
-  Decompressor D(Data);<br>
+  Decompressor D(Name, Data);<br>
   Error Err = isGnuStyle(Name) ? D.consumeCompressedGnuHeader()<br>
                                : D.consumeCompressedZLibHeader(<wbr>Is64Bit, IsLE);<br>
   if (Err)<br>
@@ -31,8 +31,8 @@ Expected<Decompressor> Decompressor::cre<br>
   return D;<br>
 }<br>
<br>
-Decompressor::Decompressor(<wbr>StringRef Data)<br>
-    : SectionData(Data), DecompressedSize(0) {}<br>
+Decompressor::Decompressor(<wbr>StringRef Name, StringRef Data)<br>
+    : SectionName(Name), SectionData(Data), DecompressedSize(0) {}<br>
<br>
 Error Decompressor::<wbr>consumeCompressedGnuHeader() {<br>
   if (!SectionData.startswith("<wbr>ZLIB"))<br>
@@ -92,3 +92,11 @@ Error Decompressor::decompress(<wbr>MutableAr<br>
   size_t Size = Buffer.size();<br>
   return zlib::uncompress(SectionData, Buffer.data(), Size);<br>
 }<br>
+<br>
+void Decompressor::<wbr>outOfMemoryHandler(void *Data, const std::string &Message,<br>
+                                      bool) {<br>
+  const auto *D = static_cast<const Decompressor *>(Data);<br>
+  report_fatal_error("<wbr>decompression of '" + Twine(D->SectionName) +<br>
+                     "' failed: unable to allocate " +<br>
+                     Twine(D->DecompressedSize) + " bytes.");<br>
+}<br>
<br>
Added: llvm/trunk/test/DebugInfo/<wbr>Inputs/dwarfdump-<wbr>decompression-invalid-size.<wbr>elf-x86-64<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/Inputs/dwarfdump-decompression-invalid-size.elf-x86-64?rev=312526&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>DebugInfo/Inputs/dwarfdump-<wbr>decompression-invalid-size.<wbr>elf-x86-64?rev=312526&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
Binary files llvm/trunk/test/DebugInfo/<wbr>Inputs/dwarfdump-<wbr>decompression-invalid-size.<wbr>elf-x86-64 (added) and llvm/trunk/test/DebugInfo/<wbr>Inputs/dwarfdump-<wbr>decompression-invalid-size.<wbr>elf-x86-64 Tue Sep  5 04:21:38 2017 differ<br>
<br>
Added: llvm/trunk/test/DebugInfo/<wbr>dwarfdump-decompression-<wbr>invalid-size.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/dwarfdump-decompression-invalid-size.test?rev=312526&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>DebugInfo/dwarfdump-<wbr>decompression-invalid-size.<wbr>test?rev=312526&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/DebugInfo/<wbr>dwarfdump-decompression-<wbr>invalid-size.test (added)<br>
+++ llvm/trunk/test/DebugInfo/<wbr>dwarfdump-decompression-<wbr>invalid-size.test Tue Sep  5 04:21:38 2017<br>
@@ -0,0 +1,13 @@<br>
+// dwarfdump-decompression-<wbr>invalid-size.elf-x86-64 is prepared using following<br>
+// source code and invocation:<br>
+// test.cpp:<br>
+// int main() { return 0; }<br>
+//<br>
+// gcc test.cpp -o out -g -Wl,--compress-debug-sections,<wbr>zlib<br>
+//<br>
+// After that result object was modified manually. Decompressed size of<br>
+// .debug_frame section was changed to 0xffffffffffffffff in compression<br>
+// header.<br>
+RUN: not llvm-dwarfdump %p/Inputs/dwarfdump-<wbr>decompression-invalid-size.<wbr>elf-x86-64 2>&1 | FileCheck %s<br>
+<br>
+CHECK: decompression of '.debug_frame' failed: unable to allocate 18446744073709551615 bytes.<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">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/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>