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