diff options
author | Kostya Serebryany <kcc@google.com> | 2016-11-30 22:39:35 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2016-11-30 22:39:35 +0000 |
commit | 05f7791fbf59e5a19ff79ed1175e7042100da8e8 (patch) | |
tree | eab47f91a9cf15f815cb14924d9c0c5c32dd324a /llvm/lib/Fuzzer/FuzzerLoop.cpp | |
parent | 5cb34077e879c03d460dedad7aaa421bd2bd08a3 (diff) | |
download | bcm5719-llvm-05f7791fbf59e5a19ff79ed1175e7042100da8e8.tar.gz bcm5719-llvm-05f7791fbf59e5a19ff79ed1175e7042100da8e8.zip |
[libFuzzer] extend -rss_limit_mb to crash instantly on a single malloc that exceeds the limit
llvm-svn: 288281
Diffstat (limited to 'llvm/lib/Fuzzer/FuzzerLoop.cpp')
-rw-r--r-- | llvm/lib/Fuzzer/FuzzerLoop.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/llvm/lib/Fuzzer/FuzzerLoop.cpp b/llvm/lib/Fuzzer/FuzzerLoop.cpp index 63cb5c8bf1b..5f02d738798 100644 --- a/llvm/lib/Fuzzer/FuzzerLoop.cpp +++ b/llvm/lib/Fuzzer/FuzzerLoop.cpp @@ -140,6 +140,7 @@ static MallocFreeTracer AllocTracer; void MallocHook(const volatile void *ptr, size_t size) { size_t N = AllocTracer.Mallocs++; + F->HandleMalloc(size); if (int TraceLevel = AllocTracer.TraceLevel) { Printf("MALLOC[%zd] %p %zd\n", N, ptr, size); if (TraceLevel >= 2 && EF) @@ -155,6 +156,21 @@ void FreeHook(const volatile void *ptr) { } } +// Crash on a single malloc that exceeds the rss limit. +void Fuzzer::HandleMalloc(size_t Size) { + if ((Size >> 20) < (size_t)Options.RssLimitMb) + return; + Printf("==%d== ERROR: libFuzzer: out-of-memory (malloc(%zd))\n", GetPid(), + Size); + Printf(" To change the out-of-memory limit use -rss_limit_mb=<N>\n\n"); + if (EF->__sanitizer_print_stack_trace) + EF->__sanitizer_print_stack_trace(); + DumpCurrentUnit("oom-"); + Printf("SUMMARY: libFuzzer: out-of-memory\n"); + PrintFinalStats(); + _Exit(Options.ErrorExitCode); // Stop right now. +} + Fuzzer::Fuzzer(UserCallback CB, InputCorpus &Corpus, MutationDispatcher &MD, FuzzingOptions Options) : CB(CB), Corpus(Corpus), MD(MD), Options(Options) { |