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 "stream_operator_fuzzer.h"
17
18 namespace OHOS {
19 const size_t THRESHOLD = 10;
20
21 enum HostCmdId {
22 STREAM_OPERATOR_FUZZ_TEST,
23 STREAM_OPERATOR_ISSTREAMSUPPORTED_V1_1,
24 STREAM_OPERATOR_COMMITSTREAM_V1_1,
25 STREAM_OPERATOR_UPDATESTREAMS,
26 STREAM_OPERATOR_CONFIRMCAPTURE,
27 STREAM_OPERATOR_END,
28 };
29
30 enum BitOperat {
31 INDEX_0 = 0,
32 INDEX_1,
33 INDEX_2,
34 INDEX_3,
35 MOVE_EIGHT_BITS = 8,
36 MOVE_SIXTEEN_BITS = 16,
37 MOVE_TWENTY_FOUR_BITS = 24,
38 };
39
ConvertUint32(const uint8_t * bitOperat)40 static uint32_t ConvertUint32(const uint8_t *bitOperat)
41 {
42 if (bitOperat == nullptr) {
43 return 0;
44 }
45
46 return (bitOperat[INDEX_0] << MOVE_TWENTY_FOUR_BITS) | (bitOperat[INDEX_1] << MOVE_SIXTEEN_BITS) |
47 (bitOperat[INDEX_2] << MOVE_EIGHT_BITS) | (bitOperat[INDEX_3]);
48 }
49
IsStreamSupportedApi(const uint8_t * & rawData)50 void IsStreamSupportedApi(const uint8_t *&rawData)
51 {
52 cameraTest->streamOperatorCallbackV1_2 = new OHOS::Camera::CameraManager::TestStreamOperatorCallbackV1_2();
53 cameraTest->rc = cameraTest->cameraDeviceV1_2->GetStreamOperator_V1_2(cameraTest->streamOperatorCallbackV1_2,
54 cameraTest->streamOperator_V1_2);
55 std::vector<uint8_t> abilityVec = {};
56 uint8_t *data = const_cast<uint8_t *>(rawData);
57 abilityVec.push_back(*data);
58
59 std::vector<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> streamInfosV1_1;
60 OHOS::HDI::Camera::V1_1::ExtendedStreamInfo extendedStreamInfo;
61 extendedStreamInfo.type = OHOS::HDI::Camera::V1_1::EXTENDED_STREAM_INFO_QUICK_THUMBNAIL;
62 extendedStreamInfo.width = 0;
63 extendedStreamInfo.height = 0;
64 extendedStreamInfo.format = 0;
65 extendedStreamInfo.dataspace = 0;
66 std::shared_ptr<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1> streamInfoCapture = nullptr;
67 streamInfoCapture = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
68 streamInfoCapture->v1_0 = {};
69 streamInfoCapture->extendedStreamInfos = {extendedStreamInfo};
70 streamInfosV1_1.push_back(*streamInfoCapture);
71 HDI::Camera::V1_0::StreamSupportType pType;
72
73 cameraTest->streamOperator_V1_2->IsStreamsSupported_V1_1(
74 *reinterpret_cast<const HDI::Camera::V1_1::OperationMode_V1_1 *>(rawData), abilityVec,
75 streamInfosV1_1, pType);
76 }
77
UpdateStreams(const uint8_t * rawData)78 void UpdateStreams(const uint8_t *rawData)
79 {
80 if (rawData == nullptr) {
81 return;
82 }
83 cameraTest->streamOperatorCallbackV1_2 = new OHOS::Camera::CameraManager::TestStreamOperatorCallbackV1_2();
84 cameraTest->rc = cameraTest->cameraDeviceV1_2->GetStreamOperator_V1_2(cameraTest->streamOperatorCallbackV1_2,
85 cameraTest->streamOperator_V1_2);
86 int *data = const_cast<int *>(reinterpret_cast<const int *>(rawData));
87 cameraTest->streamInfoV1_1 = std::make_shared<OHOS::HDI::Camera::V1_1::StreamInfo_V1_1>();
88 cameraTest->streamInfoV1_1->v1_0.streamId_ = data[0];
89 cameraTest->streamInfoV1_1->v1_0.width_ = data[0];
90 cameraTest->streamInfoV1_1->v1_0.height_ = data[0];
91 cameraTest->streamInfoV1_1->v1_0.format_ = Camera::PIXEL_FMT_YCRCB_420_SP;
92 cameraTest->streamInfoV1_1->v1_0.tunneledMode_ = data[0];
93 cameraTest->streamInfoV1_1->v1_0.dataspace_ = Camera::OHOS_CAMERA_SRGB_FULL;
94 cameraTest->streamInfosV1_1.push_back(*cameraTest->streamInfoV1_1);
95 cameraTest->rc = cameraTest->streamOperator_V1_2->UpdateStreams(cameraTest->streamInfosV1_1);
96 }
97
funcConfirmCapture(const uint8_t * rawData)98 void funcConfirmCapture(const uint8_t *rawData)
99 {
100 cameraTest->streamOperatorCallbackV1_2 = new OHOS::Camera::CameraManager::TestStreamOperatorCallbackV1_2();
101 cameraTest->rc = cameraTest->cameraDeviceV1_2->GetStreamOperator_V1_2(cameraTest->streamOperatorCallbackV1_2,
102 cameraTest->streamOperator_V1_2);
103 cameraTest->streamOperator_V1_2->ConfirmCapture(*rawData);
104 }
105
HostFuncSwitch(uint32_t cmd,const uint8_t * rawData)106 static void HostFuncSwitch(uint32_t cmd, const uint8_t *rawData)
107 {
108 switch (cmd) {
109 case STREAM_OPERATOR_ISSTREAMSUPPORTED_V1_1: {
110 IsStreamSupportedApi(rawData);
111 break;
112 }
113 case STREAM_OPERATOR_COMMITSTREAM_V1_1: {
114 cameraTest->streamOperatorCallbackV1_2 =
115 new OHOS::Camera::CameraManager::TestStreamOperatorCallbackV1_2();
116 cameraTest->rc = cameraTest->cameraDeviceV1_2->GetStreamOperator_V1_2(
117 cameraTest->streamOperatorCallbackV1_2, cameraTest->streamOperator_V1_2);
118 std::vector<uint8_t> abilityVec = {};
119 uint8_t *data = const_cast<uint8_t *>(rawData);
120 abilityVec.push_back(*data);
121 cameraTest->streamOperator_V1_2->CommitStreams_V1_1(
122 *reinterpret_cast<const HDI::Camera::V1_1::OperationMode_V1_1 *>(rawData), abilityVec);
123 break;
124 }
125 case STREAM_OPERATOR_UPDATESTREAMS:
126 UpdateStreams(rawData);
127 break;
128 case STREAM_OPERATOR_CONFIRMCAPTURE:
129 funcConfirmCapture(rawData);
130 break;
131 default:
132 return;
133 }
134 }
135
DoSomethingInterestingWithMyApi(const uint8_t * rawData,size_t size)136 bool DoSomethingInterestingWithMyApi(const uint8_t *rawData, size_t size)
137 {
138 (void)size;
139 if (rawData == nullptr) {
140 return false;
141 }
142
143 uint32_t cmd = ConvertUint32(rawData);
144 rawData += sizeof(cmd);
145
146 cameraTest = std::make_shared<OHOS::Camera::CameraManager>();
147 cameraTest->InitV1_2();
148 if (cameraTest->serviceV1_2 == nullptr) {
149 return false;
150 }
151 cameraTest->OpenCameraV1_2();
152 if (cameraTest->cameraDeviceV1_2 == nullptr) {
153 return false;
154 }
155
156 for (cmd = 0; cmd < STREAM_OPERATOR_END; cmd++) {
157 HostFuncSwitch(cmd, rawData);
158 }
159 cameraTest->Close();
160 return true;
161 }
162
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)163 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
164 {
165 if (size < OHOS::THRESHOLD) {
166 return 0;
167 }
168
169 OHOS::DoSomethingInterestingWithMyApi(data, size);
170 return 0;
171 }
172 }
173