From c29243753fa9d26e017ebe7ca49d7f0bdf894254 Mon Sep 17 00:00:00 2001 From: Kostya Serebryany Date: Fri, 20 Jan 2017 21:34:24 +0000 Subject: [PATCH] [libFuzzer] add an assert to protect against LLVMFuzzerInitialize changing argv[0] git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@292652 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Fuzzer/FuzzerDriver.cpp | 3 +++ lib/Fuzzer/test/BogusInitializeTest.cpp | 15 +++++++++++++++ lib/Fuzzer/test/CMakeLists.txt | 1 + lib/Fuzzer/test/fuzzer.test | 3 +++ 4 files changed, 22 insertions(+) create mode 100644 lib/Fuzzer/test/BogusInitializeTest.cpp diff --git a/lib/Fuzzer/FuzzerDriver.cpp b/lib/Fuzzer/FuzzerDriver.cpp index 5d619e1e216..b11b3a3a8a2 100644 --- a/lib/Fuzzer/FuzzerDriver.cpp +++ b/lib/Fuzzer/FuzzerDriver.cpp @@ -358,12 +358,15 @@ int MinimizeCrashInputInternalStep(Fuzzer *F, InputCorpus *Corpus) { int FuzzerDriver(int *argc, char ***argv, UserCallback Callback) { using namespace fuzzer; assert(argc && argv && "Argument pointers cannot be nullptr"); + std::string Argv0((*argv)[0]); EF = new ExternalFunctions(); if (EF->LLVMFuzzerInitialize) EF->LLVMFuzzerInitialize(argc, argv); const std::vector Args(*argv, *argv + *argc); assert(!Args.empty()); ProgName = new std::string(Args[0]); + assert(Argv0 == *ProgName && + "argv[0] has been modified in LLVMFuzzerInitialize"); ParseFlags(Args); if (Flags.help) { PrintHelp(); diff --git a/lib/Fuzzer/test/BogusInitializeTest.cpp b/lib/Fuzzer/test/BogusInitializeTest.cpp new file mode 100644 index 00000000000..c7e81a5478b --- /dev/null +++ b/lib/Fuzzer/test/BogusInitializeTest.cpp @@ -0,0 +1,15 @@ +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. + +// Make sure LLVMFuzzerInitialize does not change argv[0]. +#include +#include + +extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv) { + ***argv = 'X'; + return 0; +} + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { + return 0; +} diff --git a/lib/Fuzzer/test/CMakeLists.txt b/lib/Fuzzer/test/CMakeLists.txt index 5e7334f6b2a..a629d1be50b 100644 --- a/lib/Fuzzer/test/CMakeLists.txt +++ b/lib/Fuzzer/test/CMakeLists.txt @@ -65,6 +65,7 @@ set(Tests AbsNegAndConstantTest AbsNegAndConstant64Test AccumulateAllocationsTest + BogusInitializeTest BufferOverflowOnInput CallerCalleeTest CounterTest diff --git a/lib/Fuzzer/test/fuzzer.test b/lib/Fuzzer/test/fuzzer.test index 2f91c2195ca..d6298852221 100644 --- a/lib/Fuzzer/test/fuzzer.test +++ b/lib/Fuzzer/test/fuzzer.test @@ -55,3 +55,6 @@ RUN: ASAN_OPTIONS=strict_string_checks=1 not LLVMFuzzer-StrncmpOOBTest -seed=1 - STRNCMP: AddressSanitizer: heap-buffer-overflow STRNCMP-NOT: __sanitizer_weak_hook_strncmp STRNCMP: in LLVMFuzzerTestOneInput + +RUN: not --crash LLVMFuzzer-BogusInitializeTest 2>&1 | FileCheck %s --check-prefix=BOGUS_INITIALIZE +BOGUS_INITIALIZE: argv[0] has been modified in LLVMFuzzerInitialize -- 2.50.1