/* * 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 "fuzzer/FuzzedDataProvider.h" #include "utils/LruCache.h" #include "utils/StrongPointer.h" typedef android::LruCache FuzzCache; static constexpr uint32_t MAX_CACHE_ENTRIES = 800; class NoopRemovedCallback : public android::OnEntryRemoved { public: void operator()(size_t&, size_t&) { // noop } }; static NoopRemovedCallback callback; static const std::vector> operations = { [](FuzzedDataProvider*, FuzzCache* cache) -> void { cache->removeOldest(); }, [](FuzzedDataProvider*, FuzzCache* cache) -> void { cache->peekOldestValue(); }, [](FuzzedDataProvider*, FuzzCache* cache) -> void { cache->clear(); }, [](FuzzedDataProvider*, FuzzCache* cache) -> void { cache->size(); }, [](FuzzedDataProvider*, FuzzCache* cache) -> void { android::LruCache::Iterator iter(*cache); while (iter.next()) { iter.key(); iter.value(); } }, [](FuzzedDataProvider* dataProvider, FuzzCache* cache) -> void { size_t key = dataProvider->ConsumeIntegral(); size_t val = dataProvider->ConsumeIntegral(); cache->put(key, val); }, [](FuzzedDataProvider* dataProvider, FuzzCache* cache) -> void { size_t key = dataProvider->ConsumeIntegral(); cache->get(key); }, [](FuzzedDataProvider* dataProvider, FuzzCache* cache) -> void { size_t key = dataProvider->ConsumeIntegral(); cache->remove(key); }, [](FuzzedDataProvider*, FuzzCache* cache) -> void { cache->setOnEntryRemovedListener(&callback); }}; extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { FuzzedDataProvider dataProvider(data, size); FuzzCache cache(MAX_CACHE_ENTRIES); while (dataProvider.remaining_bytes() > 0) { uint8_t op = dataProvider.ConsumeIntegral() % operations.size(); operations[op](&dataProvider, &cache); } return 0; }