1 /*
2 * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "camera_device_fuzzer.h"
17 #include "camera.h"
18 #include "v1_1/icamera_device.h"
19
20 namespace OHOS {
21 const size_t RAW_DATA_SIZE_MAX = 256;
22 const size_t THRESHOLD = 10;
23
24 enum DeviceCmdId {
25 CAMERA_DEVICE_GET_DEFAULT_SETTINGS,
26 CAMERA_DEVICE_GET_STREAM_V1_1,
27 CAMERA_DEVICE_UPDATE_SETTINGS,
28 CAMERA_DEVICE_SET_RESULT_MODE,
29 CAMERA_DEVICE_GET_ENABLED_RESULTS,
30 CAMERA_DEVICE_ENABLE_RESULT,
31 CAMERA_DEVICE_DISABLE_RESULT,
32 CAMERA_DEVICE_GET_STATUS,
33 CAMERA_DEVICE_END, // Enumerated statistical value. The new enumerated value is added before
34 };
35
FuncGetDefaultSettings(const uint8_t * rawData,size_t size)36 void FuncGetDefaultSettings(const uint8_t *rawData, size_t size)
37 {
38 if (size >= RAW_DATA_SIZE_MAX) {
39 return;
40 }
41 std::vector<uint8_t> abilityVec = {};
42 uint8_t *data = const_cast<uint8_t *>(rawData);
43 abilityVec.push_back(*data);
44 cameraTest->cameraDeviceV1_1->GetDefaultSettings(abilityVec);
45 }
46
FuncGetStreamOperator_V1_1(const uint8_t * rawData,size_t size)47 void FuncGetStreamOperator_V1_1(const uint8_t *rawData, size_t size)
48 {
49 (void)size;
50 sptr<HDI::Camera::V1_0::IStreamOperatorCallback> g_callback =
51 new OHOS::Camera::CameraManager::TestStreamOperatorCallback();
52 sptr<HDI::Camera::V1_1::IStreamOperator> g_StreamOperator = nullptr;
53 cameraTest->cameraDeviceV1_1->GetStreamOperator_V1_1(g_callback, g_StreamOperator);
54 }
55
FuncUpdateSettings(const uint8_t * rawData,size_t size)56 void FuncUpdateSettings(const uint8_t *rawData, size_t size)
57 {
58 if (size >= RAW_DATA_SIZE_MAX) {
59 return;
60 }
61 std::vector<uint8_t> abilityVec = {};
62 uint8_t *data = const_cast<uint8_t *>(rawData);
63 abilityVec.push_back(*data);
64 cameraTest->cameraDeviceV1_1->UpdateSettings(abilityVec);
65 }
66
FuncSetResultMode(const uint8_t * rawData,size_t size)67 void FuncSetResultMode(const uint8_t *rawData, size_t size)
68 {
69 (void)size;
70 cameraTest->cameraDeviceV1_1->SetResultMode(
71 *reinterpret_cast<const HDI::Camera::V1_0::ResultCallbackMode *>(rawData));
72 }
73
FuncGetEnabledResults(const uint8_t * rawData,size_t size)74 void FuncGetEnabledResults(const uint8_t *rawData, size_t size)
75 {
76 (void)size;
77 std::vector<int32_t> result = {};
78 int32_t *data = const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
79 result.push_back(*data);
80 cameraTest->cameraDeviceV1_1->GetEnabledResults(result);
81 }
82
FuncEnableResult(const uint8_t * rawData,size_t size)83 void FuncEnableResult(const uint8_t *rawData, size_t size)
84 {
85 (void)size;
86 std::vector<int32_t> result = {};
87 int32_t *data = const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
88 result.push_back(*data);
89 cameraTest->cameraDeviceV1_1->EnableResult(result);
90 }
91
FuncDisableResult(const uint8_t * rawData,size_t size)92 void FuncDisableResult(const uint8_t *rawData, size_t size)
93 {
94 (void)size;
95 std::vector<int32_t> result = {};
96 int32_t *data = const_cast<int32_t *>(reinterpret_cast<const int32_t *>(rawData));
97 result.push_back(*data);
98 cameraTest->cameraDeviceV1_1->DisableResult(result);
99 }
100
FuncGetStatus(const uint8_t * rawData,size_t size)101 void FuncGetStatus(const uint8_t *rawData, size_t size)
102 {
103 (void)size;
104 std::vector<uint8_t> result = {};
105 std::vector<uint8_t> resultOut = {};
106 uint8_t *data = const_cast<uint8_t *>(reinterpret_cast<const uint8_t *>(rawData));
107 result.push_back(*data);
108
109 if (nullptr == cameraTest->cameraDeviceV1_2) {
110 return;
111 }
112 cameraTest->cameraDeviceV1_2->GetStatus(result, resultOut);
113 }
114
DeviceFuncSwitch(uint32_t cmd,const uint8_t * rawData,size_t size)115 static void DeviceFuncSwitch(uint32_t cmd, const uint8_t *rawData, size_t size)
116 {
117 CAMERA_LOGI("DeviceFuncSwitch start, the cmd is:%{public}u", cmd);
118 switch (cmd) {
119 case CAMERA_DEVICE_GET_DEFAULT_SETTINGS: {
120 FuncGetDefaultSettings(rawData, size);
121 break;
122 }
123 case CAMERA_DEVICE_GET_STREAM_V1_1: {
124 FuncGetStreamOperator_V1_1(rawData, size);
125 break;
126 }
127
128 case CAMERA_DEVICE_UPDATE_SETTINGS: {
129 FuncUpdateSettings(rawData, size);
130 break;
131 }
132 case CAMERA_DEVICE_SET_RESULT_MODE: {
133 FuncSetResultMode(rawData, size);
134 break;
135 }
136 case CAMERA_DEVICE_GET_ENABLED_RESULTS: {
137 FuncGetEnabledResults(rawData, size);
138 break;
139 }
140 case CAMERA_DEVICE_ENABLE_RESULT: {
141 FuncEnableResult(rawData, size);
142 break;
143 }
144 case CAMERA_DEVICE_DISABLE_RESULT: {
145 FuncDisableResult(rawData, size);
146 break;
147 }
148 case CAMERA_DEVICE_GET_STATUS: {
149 FuncGetStatus(rawData, size);
150 break;
151 }
152 default: {
153 CAMERA_LOGW("The interfaces is not tested, the cmd is:%{public}u", cmd);
154 return;
155 }
156 }
157 }
158
DoSomethingInterestingWithMyApi(const uint8_t * rawData,size_t size)159 bool DoSomethingInterestingWithMyApi(const uint8_t *rawData, size_t size)
160 {
161 if (rawData == nullptr) {
162 return false;
163 }
164
165 uint32_t cmd = 0;
166 rawData += sizeof(cmd);
167
168 cameraTest = std::make_shared<OHOS::Camera::CameraManager>();
169 cameraTest->Init();
170 if (cameraTest->serviceV1_1 == nullptr) {
171 return false;
172 }
173 cameraTest->Open();
174 if (cameraTest->cameraDeviceV1_1 == nullptr) {
175 return false;
176 }
177
178 for (cmd = 0; cmd < CAMERA_DEVICE_END; cmd++) {
179 DeviceFuncSwitch(cmd, rawData, size);
180 }
181 cameraTest->Close();
182 return true;
183 }
184
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)185 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
186 {
187 if (size < OHOS::THRESHOLD) {
188 CAMERA_LOGW("Fuzz test input is invalid. The size is smaller than %{public}zu", OHOS::THRESHOLD);
189 return 0;
190 }
191
192 OHOS::DoSomethingInterestingWithMyApi(data, size);
193 return 0;
194 }
195 } // namespace OHOS
196