1*8222fbe1SAndroid Build Coastguard Worker /*
2*8222fbe1SAndroid Build Coastguard Worker * Copyright (C) 2023 The Android Open Source Project
3*8222fbe1SAndroid Build Coastguard Worker *
4*8222fbe1SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*8222fbe1SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*8222fbe1SAndroid Build Coastguard Worker * You may obtain a copy of the License at:
7*8222fbe1SAndroid Build Coastguard Worker *
8*8222fbe1SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*8222fbe1SAndroid Build Coastguard Worker *
10*8222fbe1SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*8222fbe1SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*8222fbe1SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*8222fbe1SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*8222fbe1SAndroid Build Coastguard Worker * limitations under the License.
15*8222fbe1SAndroid Build Coastguard Worker *
16*8222fbe1SAndroid Build Coastguard Worker */
17*8222fbe1SAndroid Build Coastguard Worker
18*8222fbe1SAndroid Build Coastguard Worker #ifndef _LIBHIDLBASE_FUZZER_HELPER_H
19*8222fbe1SAndroid Build Coastguard Worker #define _LIBHIDLBASE_FUZZER_HELPER_H
20*8222fbe1SAndroid Build Coastguard Worker
21*8222fbe1SAndroid Build Coastguard Worker #include <fuzzer/FuzzedDataProvider.h>
22*8222fbe1SAndroid Build Coastguard Worker #include <hidl/HidlBinderSupport.h>
23*8222fbe1SAndroid Build Coastguard Worker
24*8222fbe1SAndroid Build Coastguard Worker using namespace android;
25*8222fbe1SAndroid Build Coastguard Worker using namespace hardware;
26*8222fbe1SAndroid Build Coastguard Worker using namespace details;
27*8222fbe1SAndroid Build Coastguard Worker
28*8222fbe1SAndroid Build Coastguard Worker constexpr uint32_t kMaxBytes = 256;
29*8222fbe1SAndroid Build Coastguard Worker constexpr uint32_t kMin = 0;
30*8222fbe1SAndroid Build Coastguard Worker
createHidlString(FuzzedDataProvider & fdp)31*8222fbe1SAndroid Build Coastguard Worker hidl_string createHidlString(FuzzedDataProvider& fdp) {
32*8222fbe1SAndroid Build Coastguard Worker auto invokeHidlString = fdp.PickValueInArray<const std::function<hidl_string()>>({
33*8222fbe1SAndroid Build Coastguard Worker [&]() { return hidl_string(fdp.ConsumeRandomLengthString(kMaxBytes)); },
34*8222fbe1SAndroid Build Coastguard Worker [&]() { return hidl_string((fdp.ConsumeRandomLengthString(kMaxBytes)).c_str()); },
35*8222fbe1SAndroid Build Coastguard Worker [&]() {
36*8222fbe1SAndroid Build Coastguard Worker std::string testString = fdp.ConsumeRandomLengthString(kMaxBytes);
37*8222fbe1SAndroid Build Coastguard Worker return hidl_string(testString.c_str(),
38*8222fbe1SAndroid Build Coastguard Worker fdp.ConsumeIntegralInRange<uint32_t>(kMin, testString.length()));
39*8222fbe1SAndroid Build Coastguard Worker },
40*8222fbe1SAndroid Build Coastguard Worker [&]() { return fdp.ConsumeRandomLengthString(kMaxBytes); },
41*8222fbe1SAndroid Build Coastguard Worker });
42*8222fbe1SAndroid Build Coastguard Worker return invokeHidlString();
43*8222fbe1SAndroid Build Coastguard Worker }
44*8222fbe1SAndroid Build Coastguard Worker
createHidlMemory(FuzzedDataProvider & fdp)45*8222fbe1SAndroid Build Coastguard Worker hidl_memory createHidlMemory(FuzzedDataProvider& fdp) {
46*8222fbe1SAndroid Build Coastguard Worker if (fdp.ConsumeBool()) {
47*8222fbe1SAndroid Build Coastguard Worker return hidl_memory();
48*8222fbe1SAndroid Build Coastguard Worker }
49*8222fbe1SAndroid Build Coastguard Worker return hidl_memory(createHidlString(fdp), hidl_handle(),
50*8222fbe1SAndroid Build Coastguard Worker fdp.ConsumeIntegral<uint64_t>() /* size */);
51*8222fbe1SAndroid Build Coastguard Worker }
52*8222fbe1SAndroid Build Coastguard Worker
createStatus(FuzzedDataProvider & fdp)53*8222fbe1SAndroid Build Coastguard Worker Status createStatus(FuzzedDataProvider& fdp) {
54*8222fbe1SAndroid Build Coastguard Worker auto invokeStatus = fdp.PickValueInArray<const std::function<Status()>>({
55*8222fbe1SAndroid Build Coastguard Worker [&]() { return Status::fromExceptionCode(fdp.ConsumeIntegral<uint32_t>()); },
56*8222fbe1SAndroid Build Coastguard Worker [&]() {
57*8222fbe1SAndroid Build Coastguard Worker return Status::fromExceptionCode(
58*8222fbe1SAndroid Build Coastguard Worker fdp.ConsumeIntegral<uint32_t>(),
59*8222fbe1SAndroid Build Coastguard Worker (fdp.ConsumeRandomLengthString(kMaxBytes)).c_str());
60*8222fbe1SAndroid Build Coastguard Worker },
61*8222fbe1SAndroid Build Coastguard Worker [&]() { return Status::fromStatusT(fdp.ConsumeIntegral<uint32_t>()); },
62*8222fbe1SAndroid Build Coastguard Worker [&]() { return Status(); },
63*8222fbe1SAndroid Build Coastguard Worker });
64*8222fbe1SAndroid Build Coastguard Worker return invokeStatus();
65*8222fbe1SAndroid Build Coastguard Worker }
66*8222fbe1SAndroid Build Coastguard Worker
67*8222fbe1SAndroid Build Coastguard Worker #endif // _LIBHIDLBASE_FUZZER_HELPER_H
68