<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, May 23, 2016 at 10:59 AM, David Blaikie 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: dblaikie<br>
Date: Mon May 23 12:59:17 2016<br>
New Revision: 270466<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=270466&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=270466&view=rev</a><br>
Log:<br>
llvm-dwp: More error handling around invalid compressed sections<br>
<br>
Added:<br>
    llvm/trunk/test/tools/llvm-dwp/Inputs/empty_compressed_section.dwo<br>
    llvm/trunk/test/tools/llvm-dwp/Inputs/invalid_compressed.dwo<br>
Modified:<br>
    llvm/trunk/test/tools/llvm-dwp/X86/compressfail.test<br>
    llvm/trunk/tools/llvm-dwp/llvm-dwp.cpp<br>
<br>
Added: llvm/trunk/test/tools/llvm-dwp/Inputs/empty_compressed_section.dwo<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-dwp/Inputs/empty_compressed_section.dwo?rev=270466&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-dwp/Inputs/empty_compressed_section.dwo?rev=270466&view=auto</a><br>
==============================================================================<br>
Binary files llvm/trunk/test/tools/llvm-dwp/Inputs/empty_compressed_section.dwo (added) and llvm/trunk/test/tools/llvm-dwp/Inputs/empty_compressed_section.dwo Mon May 23 12:59:17 2016 differ<br>
<br>
Added: llvm/trunk/test/tools/llvm-dwp/Inputs/invalid_compressed.dwo<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-dwp/Inputs/invalid_compressed.dwo?rev=270466&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-dwp/Inputs/invalid_compressed.dwo?rev=270466&view=auto</a><br>
==============================================================================<br>
Binary files llvm/trunk/test/tools/llvm-dwp/Inputs/invalid_compressed.dwo (added) and llvm/trunk/test/tools/llvm-dwp/Inputs/invalid_compressed.dwo Mon May 23 12:59:17 2016 differ<br>
<br>
Modified: llvm/trunk/test/tools/llvm-dwp/X86/compressfail.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-dwp/X86/compressfail.test?rev=270466&r1=270465&r2=270466&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-dwp/X86/compressfail.test?rev=270466&r1=270465&r2=270466&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/tools/llvm-dwp/X86/compressfail.test (original)<br>
+++ llvm/trunk/test/tools/llvm-dwp/X86/compressfail.test Mon May 23 12:59:17 2016<br>
@@ -1,5 +1,7 @@<br>
 RUN: not llvm-dwp %p/../Inputs/compressfail/a.dwo -o %t 2>&1 | FileCheck %s<br>
+RUN: not llvm-dwp %p/../Inputs/empty_compressed_section.dwo -o %t 2>&1 | FileCheck %s<br>
+RUN: not llvm-dwp %p/../Inputs/invalid_compressed.dwo -o %t 2>&1 | FileCheck %s<br>
<br>
 REQUIRES: zlib<br>
<br>
-CHECK: error: failure while decompressing compressed section: 'zdebug_info.dwo'<br>
+CHECK: error: failure while decompressing compressed section: 'zdebug_{{.*}}.dwo'<br>
<br>
Modified: llvm/trunk/tools/llvm-dwp/llvm-dwp.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-dwp/llvm-dwp.cpp?rev=270466&r1=270465&r2=270466&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-dwp/llvm-dwp.cpp?rev=270466&r1=270465&r2=270466&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-dwp/llvm-dwp.cpp (original)<br>
+++ llvm/trunk/tools/llvm-dwp/llvm-dwp.cpp Mon May 23 12:59:17 2016<br>
@@ -432,20 +432,17 @@ static Error write(MCStreamer &Out, Arra<br>
         return errorCodeToError(Err);<br>
<br>
       if (Name.startswith("zdebug_")) {<br>
+        UncompressedSections.emplace_back();<br>
         uint64_t OriginalSize;<br>
         if (!zlib::isAvailable())<br>
           return make_error<DWPError>("zlib not available");<br>
-        if (!consumeCompressedDebugSectionHeader(Contents, OriginalSize))<br>
+        if (!consumeCompressedDebugSectionHeader(Contents, OriginalSize) ||<br>
+            zlib::uncompress(Contents, UncompressedSections.back(),<br>
+                             OriginalSize) != zlib::StatusOK)<br>
           return make_error<DWPError>(<br>
               ("failure while decompressing compressed section: '" + Name +<br>
                "\'")<br>
                   .str());<br>
-        UncompressedSections.resize(UncompressedSections.size() + 1);<br>
-        if (zlib::uncompress(Contents, UncompressedSections.back(),<br>
-                             OriginalSize) != zlib::StatusOK) {<br>
-          UncompressedSections.pop_back();<br>
-          continue;<br>
-        }<br>
         Name = Name.substr(1);<br>
         Contents = UncompressedSections.back();</blockquote><div><br></div><div>This use of UncompressedSections looks wrong. Either:</div><div><br></div><div>1) you only need storage for a single string, and can reuse that storage for each section you decompress, or</div><div>2) you are holding onto a StringRef referring to a SmallString vector element across that vector being resized</div><div><br></div><div>From code inspection, it looks like option (1): you can replace the UncompressedSections vector with storage for a single uncompressed section.</div></div></div></div>