From 7168f2726eccdc00210ba59563a4ed3b821cca9d Mon Sep 17 00:00:00 2001 From: Dylan Katz Date: Thu, 2 Jul 2020 11:51:44 -0700 Subject: Add second batch of fuzzers for libutils This adds fuzzers for: - CallStack - Looper - LruCache - Printer - ProcessCallStack - PropertyMap - RWLock - RefBase - StopWatch. Test: Ran each fuzzer for 10 minutes. Rough coverage est. (likely far below actual value): 10.97% Signed-off-by: Dylan Katz Change-Id: I2f9f35c18b13338c282fb7f9c3ea4099ecb2c56f --- libutils/Looper_fuzz.cpp | 84 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 libutils/Looper_fuzz.cpp (limited to 'libutils/Looper_fuzz.cpp') diff --git a/libutils/Looper_fuzz.cpp b/libutils/Looper_fuzz.cpp new file mode 100644 index 000000000..c3ae54ece --- /dev/null +++ b/libutils/Looper_fuzz.cpp @@ -0,0 +1,84 @@ +/* + * Copyright 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include + +#include + +#include "Looper_test_pipe.h" +#include "fuzzer/FuzzedDataProvider.h" + +using android::Looper; +using android::sp; + +// We don't want this to bog down fuzzing +static constexpr int MAX_POLL_DELAY = 50; +static constexpr int MAX_OPERATIONS = 500; + +void doNothing() {} +void* doNothingPointer = reinterpret_cast(doNothing); + +static int noopCallback(int, int, void*) { + return 0; +} + +std::vector, Pipe)>> operations = { + [](FuzzedDataProvider* dataProvider, sp looper, Pipe) -> void { + looper->pollOnce(dataProvider->ConsumeIntegralInRange(0, MAX_POLL_DELAY)); + }, + [](FuzzedDataProvider* dataProvider, sp looper, Pipe) -> void { + looper->pollAll(dataProvider->ConsumeIntegralInRange(0, MAX_POLL_DELAY)); + }, + // events and callback are nullptr + [](FuzzedDataProvider* dataProvider, sp looper, Pipe pipeObj) -> void { + looper->addFd(pipeObj.receiveFd, dataProvider->ConsumeIntegral(), + dataProvider->ConsumeIntegral(), nullptr, nullptr); + }, + // Events is nullptr + [](FuzzedDataProvider* dataProvider, sp looper, Pipe pipeObj) -> void { + looper->addFd(pipeObj.receiveFd, dataProvider->ConsumeIntegral(), + dataProvider->ConsumeIntegral(), noopCallback, nullptr); + }, + // callback is nullptr + [](FuzzedDataProvider* dataProvider, sp looper, Pipe pipeObj) -> void { + looper->addFd(pipeObj.receiveFd, dataProvider->ConsumeIntegral(), + dataProvider->ConsumeIntegral(), nullptr, doNothingPointer); + }, + // callback and events both set + [](FuzzedDataProvider* dataProvider, sp looper, Pipe pipeObj) -> void { + looper->addFd(pipeObj.receiveFd, dataProvider->ConsumeIntegral(), + dataProvider->ConsumeIntegral(), noopCallback, doNothingPointer); + }, + + [](FuzzedDataProvider*, sp looper, Pipe) -> void { looper->wake(); }, + [](FuzzedDataProvider*, sp, Pipe pipeObj) -> void { pipeObj.writeSignal(); }}; + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { + Pipe pipeObj; + FuzzedDataProvider dataProvider(data, size); + sp looper = new Looper(dataProvider.ConsumeBool()); + + size_t opsRun = 0; + while (dataProvider.remaining_bytes() > 0 && opsRun++ < MAX_OPERATIONS) { + uint8_t op = dataProvider.ConsumeIntegralInRange(0, operations.size() - 1); + operations[op](&dataProvider, looper, pipeObj); + } + // Clear our pointer + looper.clear(); + return 0; +} -- cgit v1.2.3