blob: 69f1b9dfb2b566da50c6b648b95ffbb270eeb4f6 [file] [log] [blame]
Corbin Souffrant84f5c0f2020-06-26 00:42:43 -07001/*
2 * Copyright 2020 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
19#include <IBinderFuzzFunctions.h>
20#include <fuzzer/FuzzedDataProvider.h>
21
22#include <binder/Binder.h>
23#include <binder/IBinder.h>
24#include <binder/Parcel.h>
25#include <stdint.h>
26#include <atomic>
27
28namespace android {
29
30/* This is a vector of lambda functions the fuzzer will pull from.
31 * This is done so new functions can be added to the fuzzer easily
32 * without requiring modifications to the main fuzzer file. This also
33 * allows multiple fuzzers to include this file, if functionality is needed.
34 */
35static const std::vector<std::function<void(FuzzedDataProvider*, const sp<BBinder>&)>>
36 gBBinderOperations = {[](FuzzedDataProvider*, const sp<BBinder>& bbinder) -> void {
37 bbinder->isRequestingSid();
38 },
39 [](FuzzedDataProvider* fdp, const sp<BBinder>& bbinder) -> void {
Steven Morelandcf03cf12020-12-04 02:58:40 +000040 bool requestSid = fdp->ConsumeBool();
41 bbinder->setRequestingSid(requestSid);
Corbin Souffrant84f5c0f2020-06-26 00:42:43 -070042 },
43 [](FuzzedDataProvider*, const sp<BBinder>& bbinder) -> void {
44 bbinder->getExtension();
45 },
46 [](FuzzedDataProvider*, const sp<BBinder>& bbinder) -> void {
47 static IBinder* extension = nullptr;
48 bbinder->setExtension(extension);
49 },
50 [](FuzzedDataProvider* fdp, const sp<BBinder>& bbinder) -> void {
51 int priority;
52 int policy = fdp->ConsumeIntegralInRange<int>(0, 2);
53 if (policy == 0) {
54 priority = fdp->ConsumeIntegralInRange<int>(-20, 19);
55 } else {
56 priority = fdp->ConsumeIntegralInRange<int>(1, 99);
57 }
58 bbinder->setMinSchedulerPolicy(policy, priority);
59 },
60 [](FuzzedDataProvider*, const sp<BBinder>& bbinder) -> void {
61 bbinder->getMinSchedulerPolicy();
62 },
63 [](FuzzedDataProvider*, const sp<BBinder>& bbinder) -> void {
64 bbinder->getMinSchedulerPriority();
65 },
Steven Morelandcf03cf12020-12-04 02:58:40 +000066 [](FuzzedDataProvider* fdp, const sp<BBinder>& bbinder) -> void {
67 bool inheritRt = fdp->ConsumeBool();
68 bbinder->setInheritRt(inheritRt);
69 },
70 [](FuzzedDataProvider*, const sp<BBinder>& bbinder) -> void {
71 bbinder->isInheritRt();
72 },
Corbin Souffrant84f5c0f2020-06-26 00:42:43 -070073 [](FuzzedDataProvider*, const sp<BBinder>& bbinder) -> void {
74 bbinder->getDebugPid();
75 }};
76
77} // namespace android