[llvm] r312526 - [Decompression] Fail gracefully when out of memory

Alex L via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 5 04:39:39 PDT 2017


I think you need `// REQUIRES: zlib` in your test.

On 5 September 2017 at 12:21, Jonas Devlieghere via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: jdevlieghere
> Date: Tue Sep  5 04:21:38 2017
> New Revision: 312526
>
> URL: http://llvm.org/viewvc/llvm-project?rev=312526&view=rev
> Log:
> [Decompression] Fail gracefully when out of memory
>
> This patch adds failing gracefully when running out of memory when
> allocating a buffer for decompression.
>
> This provides a work-around for:
> https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3224
>
> Differential revision: https://reviews.llvm.org/D37447
>
> Added:
>     llvm/trunk/test/DebugInfo/Inputs/dwarfdump-decompression-invalid-size.
> elf-x86-64
>     llvm/trunk/test/DebugInfo/dwarfdump-decompression-invalid-size.test
> Modified:
>     llvm/trunk/include/llvm/Object/Decompressor.h
>     llvm/trunk/lib/Object/Decompressor.cpp
>
> Modified: llvm/trunk/include/llvm/Object/Decompressor.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/
> llvm/Object/Decompressor.h?rev=312526&r1=312525&r2=312526&view=diff
> ============================================================
> ==================
> --- llvm/trunk/include/llvm/Object/Decompressor.h (original)
> +++ llvm/trunk/include/llvm/Object/Decompressor.h Tue Sep  5 04:21:38 2017
> @@ -13,6 +13,7 @@
>  #include "llvm/ADT/SmallString.h"
>  #include "llvm/ADT/StringRef.h"
>  #include "llvm/Object/ObjectFile.h"
> +#include "llvm/Support/ErrorHandling.h"
>
>  namespace llvm {
>  namespace object {
> @@ -31,7 +32,9 @@ public:
>    /// @brief Resize the buffer and uncompress section data into it.
>    /// @param Out         Destination buffer.
>    template <class T> Error resizeAndDecompress(T &Out) {
> +    install_bad_alloc_error_handler(outOfMemoryHandler, this);
>      Out.resize(DecompressedSize);
> +    remove_bad_alloc_error_handler();
>      return decompress({Out.data(), (size_t)DecompressedSize});
>    }
>
> @@ -52,11 +55,14 @@ public:
>    static bool isGnuStyle(StringRef Name);
>
>  private:
> -  Decompressor(StringRef Data);
> +  static void outOfMemoryHandler(void *Data, const std::string &Message,
> bool);
> +
> +  Decompressor(StringRef Name, StringRef Data);
>
>    Error consumeCompressedGnuHeader();
>    Error consumeCompressedZLibHeader(bool Is64Bit, bool IsLittleEndian);
>
> +  StringRef SectionName;
>    StringRef SectionData;
>    uint64_t DecompressedSize;
>  };
>
> Modified: llvm/trunk/lib/Object/Decompressor.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/
> Decompressor.cpp?rev=312526&r1=312525&r2=312526&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/Object/Decompressor.cpp (original)
> +++ llvm/trunk/lib/Object/Decompressor.cpp Tue Sep  5 04:21:38 2017
> @@ -23,7 +23,7 @@ Expected<Decompressor> Decompressor::cre
>    if (!zlib::isAvailable())
>      return createError("zlib is not available");
>
> -  Decompressor D(Data);
> +  Decompressor D(Name, Data);
>    Error Err = isGnuStyle(Name) ? D.consumeCompressedGnuHeader()
>                                 : D.consumeCompressedZLibHeader(Is64Bit,
> IsLE);
>    if (Err)
> @@ -31,8 +31,8 @@ Expected<Decompressor> Decompressor::cre
>    return D;
>  }
>
> -Decompressor::Decompressor(StringRef Data)
> -    : SectionData(Data), DecompressedSize(0) {}
> +Decompressor::Decompressor(StringRef Name, StringRef Data)
> +    : SectionName(Name), SectionData(Data), DecompressedSize(0) {}
>
>  Error Decompressor::consumeCompressedGnuHeader() {
>    if (!SectionData.startswith("ZLIB"))
> @@ -92,3 +92,11 @@ Error Decompressor::decompress(MutableAr
>    size_t Size = Buffer.size();
>    return zlib::uncompress(SectionData, Buffer.data(), Size);
>  }
> +
> +void Decompressor::outOfMemoryHandler(void *Data, const std::string
> &Message,
> +                                      bool) {
> +  const auto *D = static_cast<const Decompressor *>(Data);
> +  report_fatal_error("decompression of '" + Twine(D->SectionName) +
> +                     "' failed: unable to allocate " +
> +                     Twine(D->DecompressedSize) + " bytes.");
> +}
>
> Added: llvm/trunk/test/DebugInfo/Inputs/dwarfdump-
> decompression-invalid-size.elf-x86-64
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/
> DebugInfo/Inputs/dwarfdump-decompression-invalid-size.
> elf-x86-64?rev=312526&view=auto
> ============================================================
> ==================
> Binary files llvm/trunk/test/DebugInfo/Inputs/dwarfdump-
> decompression-invalid-size.elf-x86-64 (added) and
> llvm/trunk/test/DebugInfo/Inputs/dwarfdump-decompression-invalid-size.elf-x86-64
> Tue Sep  5 04:21:38 2017 differ
>
> Added: llvm/trunk/test/DebugInfo/dwarfdump-decompression-invalid-size.test
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/
> DebugInfo/dwarfdump-decompression-invalid-size.test?rev=312526&view=auto
> ============================================================
> ==================
> --- llvm/trunk/test/DebugInfo/dwarfdump-decompression-invalid-size.test
> (added)
> +++ llvm/trunk/test/DebugInfo/dwarfdump-decompression-invalid-size.test
> Tue Sep  5 04:21:38 2017
> @@ -0,0 +1,13 @@
> +// dwarfdump-decompression-invalid-size.elf-x86-64 is prepared using
> following
> +// source code and invocation:
> +// test.cpp:
> +// int main() { return 0; }
> +//
> +// gcc test.cpp -o out -g -Wl,--compress-debug-sections,zlib
> +//
> +// After that result object was modified manually. Decompressed size of
> +// .debug_frame section was changed to 0xffffffffffffffff in compression
> +// header.
> +RUN: not llvm-dwarfdump %p/Inputs/dwarfdump-decompression-invalid-size.elf-x86-64
> 2>&1 | FileCheck %s
> +
> +CHECK: decompression of '.debug_frame' failed: unable to allocate
> 18446744073709551615 bytes.
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170905/de25cfa7/attachment.html>


More information about the llvm-commits mailing list