xref: /aosp_15_r20/system/libhidl/fuzzer/libHidlBase_fuzzer_helper.h (revision 8222fbe171c3d6fadfe95119c180cf3010c392a8)
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