• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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