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