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