1 /*
2 * Copyright (c) 2024 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 #include "fuzzer/FuzzedDataProvider.h"
16 #include "scan_manager_client.h"
17 #include "scan_callback.h"
18 #include "scanner_info.h"
19 #include "scanmanagerclient_fuzzer.h"
20
21 namespace OHOS::Scan {
22 constexpr uint8_t MAX_STRING_LENGTH = 255;
23 constexpr int MAX_SET_NUMBER = 100;
24 constexpr size_t FOO_MAX_LEN = 1024;
25 constexpr size_t U32_AT_SIZE = 4;
26
TestGetScannerList(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)27 void TestGetScannerList(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
28 {
29 auto scanManagerPtr = ScanManagerClient::GetInstance();
30 if (scanManagerPtr == nullptr) {
31 return;
32 }
33 scanManagerPtr->InitScan();
34 scanManagerPtr->GetScannerList();
35 scanManagerPtr->ExitScan();
36 }
37
TestGetScanOptionDesc(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)38 void TestGetScanOptionDesc(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
39 {
40 auto scanManagerPtr = ScanManagerClient::GetInstance();
41 if (scanManagerPtr == nullptr) {
42 return;
43 }
44 scanManagerPtr->InitScan();
45 std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
46 int32_t optionIndex = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
47 ScanOptionDescriptor desc;
48 scanManagerPtr->OpenScanner(scannerId);
49 scanManagerPtr->GetScanOptionDesc(scannerId, optionIndex, desc);
50 scanManagerPtr->CloseScanner(scannerId);
51 scanManagerPtr->ExitScan();
52 }
53
TestOpScanOptionValue(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)54 void TestOpScanOptionValue(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
55 {
56 auto scanManagerPtr = ScanManagerClient::GetInstance();
57 if (scanManagerPtr == nullptr) {
58 return;
59 }
60 scanManagerPtr->InitScan();
61 std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
62 int32_t optionIndex = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
63 auto op = static_cast<ScanOptionOpType>(dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER));
64 ScanOptionValue value;
65 scanManagerPtr->OpenScanner(scannerId);
66 scanManagerPtr->OpScanOptionValue(scannerId, optionIndex, op, value);
67 scanManagerPtr->CloseScanner(scannerId);
68 scanManagerPtr->ExitScan();
69 }
70
TestGetScanParameters(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)71 void TestGetScanParameters(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
72 {
73 auto scanManagerPtr = ScanManagerClient::GetInstance();
74 if (scanManagerPtr == nullptr) {
75 return;
76 }
77 scanManagerPtr->InitScan();
78 std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
79 ScanParameters para;
80 scanManagerPtr->OpenScanner(scannerId);
81 scanManagerPtr->GetScanParameters(scannerId, para);
82 scanManagerPtr->CloseScanner(scannerId);
83 scanManagerPtr->ExitScan();
84 }
85
TestStartScan(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)86 void TestStartScan(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
87 {
88 auto scanManagerPtr = ScanManagerClient::GetInstance();
89 if (scanManagerPtr == nullptr) {
90 return;
91 }
92 scanManagerPtr->InitScan();
93 std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
94 bool batchMode = dataProvider->ConsumeBool();
95 scanManagerPtr->OpenScanner(scannerId);
96 scanManagerPtr->StartScan(scannerId, batchMode);
97 scanManagerPtr->CancelScan(scannerId);
98 scanManagerPtr->CloseScanner(scannerId);
99 scanManagerPtr->ExitScan();
100 }
101
TestOn(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)102 void TestOn(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
103 {
104 auto scanManagerPtr = ScanManagerClient::GetInstance();
105 if (scanManagerPtr == nullptr) {
106 return;
107 }
108 std::string taskId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
109 std::string type = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
110 std::function<void(std::vector<ScanDeviceInfo> &infos)> callbackFunction;
111 sptr<IScanCallback> listener = new (std::nothrow) ScanCallback(callbackFunction);
112 if (listener == nullptr) {
113 return;
114 }
115 scanManagerPtr->On(taskId, type, listener);
116 }
117
TestOff(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)118 void TestOff(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
119 {
120 auto scanManagerPtr = ScanManagerClient::GetInstance();
121 if (scanManagerPtr == nullptr) {
122 return;
123 }
124 std::string taskId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
125 std::string type = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
126 scanManagerPtr->Off(taskId, type);
127 }
128
TestGetScanProgress(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)129 void TestGetScanProgress(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
130 {
131 auto scanManagerPtr = ScanManagerClient::GetInstance();
132 if (scanManagerPtr == nullptr) {
133 return;
134 }
135 std::string scannerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
136 ScanProgress prog;
137 scanManagerPtr->GetScanProgress(scannerId, prog);
138 }
139
TestAddScanner(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)140 void TestAddScanner(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
141 {
142 auto scanManagerPtr = ScanManagerClient::GetInstance();
143 if (scanManagerPtr == nullptr) {
144 return;
145 }
146 std::string serialNumber = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
147 std::string discoverMode = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
148 scanManagerPtr->AddScanner(serialNumber, discoverMode);
149 }
150
TestDeleteScanner(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)151 void TestDeleteScanner(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
152 {
153 auto scanManagerPtr = ScanManagerClient::GetInstance();
154 if (scanManagerPtr == nullptr) {
155 return;
156 }
157 std::string serialNumber = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
158 std::string discoverMode = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
159 scanManagerPtr->DeleteScanner(serialNumber, discoverMode);
160 }
161
TestGetAddedScanner(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)162 void TestGetAddedScanner(const uint8_t* data, size_t size, FuzzedDataProvider* dataProvider)
163 {
164 auto scanManagerPtr = ScanManagerClient::GetInstance();
165 if (scanManagerPtr == nullptr) {
166 return;
167 }
168 int32_t count = dataProvider->ConsumeIntegralInRange<int32_t>(0, MAX_SET_NUMBER);
169 std::vector<ScanDeviceInfo> allAddedScanner(count);
170 scanManagerPtr->GetAddedScanner(allAddedScanner);
171 }
172
173 }
174
175 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)176 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
177 {
178 if (data == nullptr) {
179 return 0;
180 }
181
182 if (size < OHOS::Scan::U32_AT_SIZE || size > OHOS::Scan::FOO_MAX_LEN) {
183 return 0;
184 }
185 FuzzedDataProvider dataProvider(data, size);
186 OHOS::Scan::TestGetScannerList(data, size, &dataProvider);
187 OHOS::Scan::TestGetScanOptionDesc(data, size, &dataProvider);
188 OHOS::Scan::TestOpScanOptionValue(data, size, &dataProvider);
189 OHOS::Scan::TestGetScanParameters(data, size, &dataProvider);
190 OHOS::Scan::TestStartScan(data, size, &dataProvider);
191 OHOS::Scan::TestOn(data, size, &dataProvider);
192 OHOS::Scan::TestOff(data, size, &dataProvider);
193 OHOS::Scan::TestGetScanProgress(data, size, &dataProvider);
194 OHOS::Scan::TestAddScanner(data, size, &dataProvider);
195 OHOS::Scan::TestDeleteScanner(data, size, &dataProvider);
196 OHOS::Scan::TestGetAddedScanner(data, size, &dataProvider);
197
198 return 0;
199 }
200
201