1 /*
2 * Copyright (c) 2022 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 #define private public
17 #define protected public
18 #include "vendormanager_fuzzer.h"
19 #include "fuzzer/FuzzedDataProvider.h"
20 #include "print_log.h"
21 #include "print_constant.h"
22 #include "vendor_manager.h"
23 #include "vendor_driver_base.h"
24 #include "vendor_wlan_group.h"
25 #include "vendor_ppd_driver.h"
26 #include "print_service_ability.h"
27 #include "print_service_ability_mock_permission.h"
28
29
30 namespace OHOS {
31 namespace Print {
32 constexpr uint8_t MAX_STRING_LENGTH = 20;
33 constexpr size_t U32_AT_SIZE = 4;
34 constexpr size_t FOO_MAX_LEN = 64;
35 static const std::string DEFAULT_VENDOR_NAME = "testVendorName";
36 static ConnectMethod METHOD_DEFAULT = ID_AUTO;
37 static const std::string DEFAULT_PROTOCOL = "ipp";
38 static const int32_t DEFAULT_TIMEOUT = 0;
39
TestWlanGroupDiscoverPrinterActions(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)40 void TestWlanGroupDiscoverPrinterActions(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
41 {
42 VendorManager vendorManager;
43 vendorManager.Init(PrintServiceAbility::GetInstance());
44 auto vendorWlanGroup = std::static_pointer_cast<VendorWlanGroup>(vendorManager.wlanGroupDriver);
45
46 std::string printerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
47 PrinterInfo printerInfo;
48 printerInfo.SetPrinterId(printerId);
49 printerInfo.SetPrinterName(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
50 printerInfo.SetUri(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
51 printerInfo.SetPrinterMake(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
52 printerInfo.SetOption(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
53
54 vendorWlanGroup->OnPrinterDiscovered(DEFAULT_VENDOR_NAME, printerInfo);
55 printerInfo.SetPrinterName(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
56 printerInfo.SetUri(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
57 vendorWlanGroup->OnUpdatePrinterToDiscovery(DEFAULT_VENDOR_NAME, printerInfo);
58 vendorWlanGroup->OnPrinterRemoved(DEFAULT_VENDOR_NAME, printerId);
59
60 vendorWlanGroup->vendorManager = nullptr;
61 vendorWlanGroup->parentVendorManager = nullptr;
62 vendorWlanGroup->OnPrinterDiscovered(DEFAULT_VENDOR_NAME, printerInfo);
63 vendorWlanGroup->OnUpdatePrinterToDiscovery(DEFAULT_VENDOR_NAME, printerInfo);
64 vendorWlanGroup->OnPrinterRemoved(DEFAULT_VENDOR_NAME, printerId);
65 }
66
TestWlanGroupConnectPrinterActions(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)67 void TestWlanGroupConnectPrinterActions(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
68 {
69 VendorManager vendorManager;
70 vendorManager.Init(PrintServiceAbility::GetInstance());
71 auto vendorWlanGroup = std::static_pointer_cast<VendorWlanGroup>(vendorManager.wlanGroupDriver);
72
73 std::string printerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
74 PrinterInfo printerInfo;
75 printerInfo.SetPrinterId(printerId);
76 printerInfo.SetPrinterName(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
77 std::string printerUri = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
78 printerInfo.SetUri(printerUri);
79 printerInfo.SetPrinterMake(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
80 printerInfo.SetOption(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
81 vendorWlanGroup->OnPrinterDiscovered(DEFAULT_VENDOR_NAME, printerInfo);
82
83 vendorWlanGroup->SetConnectingPrinter(METHOD_DEFAULT, printerId);
84 vendorWlanGroup->IsGroupDriver(printerId);
85 vendorWlanGroup->IsConnectingPrinter(printerId, printerUri);
86 // OnQueryCapability has some problem on fuzzFwk when call successfully.
87 vendorWlanGroup->OnQueryCapabilityByIp(printerUri, DEFAULT_PROTOCOL);
88
89 vendorWlanGroup->vendorManager = nullptr;
90 vendorWlanGroup->parentVendorManager = nullptr;
91 vendorWlanGroup->SetConnectingPrinter(METHOD_DEFAULT, printerId);
92 vendorWlanGroup->IsGroupDriver(printerId);
93 vendorWlanGroup->IsConnectingPrinter(printerId, printerUri);
94 vendorWlanGroup->OnQueryCapability(printerId, DEFAULT_TIMEOUT);
95 vendorWlanGroup->OnQueryCapabilityByIp(printerUri, DEFAULT_PROTOCOL);
96 }
97
TestWlanGroupOtherFunction(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)98 void TestWlanGroupOtherFunction(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
99 {
100 VendorManager vendorManager;
101 vendorManager.Init(PrintServiceAbility::GetInstance());
102 auto vendorWlanGroup = std::static_pointer_cast<VendorWlanGroup>(vendorManager.wlanGroupDriver);
103
104 std::string printerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
105 std::string printerBsuriId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
106 std::string ppdName = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
107 std::string ppdData = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
108 PrinterInfo printerInfo;
109 printerInfo.SetPrinterId(printerId);
110 printerInfo.SetPrinterName(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
111 printerInfo.SetUri(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
112 printerInfo.SetPrinterMake(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
113 printerInfo.SetOption(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
114 std::string vendorName = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
115
116 // other function
117 vendorWlanGroup->OnPrinterPpdQueried(DEFAULT_VENDOR_NAME, printerId, ppdName, ppdData);
118 vendorWlanGroup->ConvertGroupDriver(printerId, vendorName);
119 vendorWlanGroup->ConvertGroupGlobalPrinterId(printerId);
120 vendorWlanGroup->GetGroupPrinterId(printerId);
121 vendorWlanGroup->UpdateGroupPrinter(printerId, printerBsuriId);
122 vendorWlanGroup->ExtractPrinterIdByPrinterInfo(printerInfo);
123
124 // other function without vendorManager
125 vendorWlanGroup->vendorManager = nullptr;
126 vendorWlanGroup->parentVendorManager = nullptr;
127 vendorWlanGroup->OnPrinterPpdQueried(DEFAULT_VENDOR_NAME, printerId, ppdName, ppdData);
128 vendorWlanGroup->ConvertGroupDriver(printerId, vendorName);
129 vendorWlanGroup->ConvertGroupGlobalPrinterId(printerId);
130 vendorWlanGroup->GetGroupPrinterId(printerId);
131 vendorWlanGroup->UpdateGroupPrinter(printerId, printerBsuriId);
132 vendorWlanGroup->ExtractPrinterIdByPrinterInfo(printerInfo);
133 }
134
TestPpdDriverConnectPrinterActions(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)135 void TestPpdDriverConnectPrinterActions(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
136 {
137 VendorManager vendorManager;
138 vendorManager.Init(PrintServiceAbility::GetInstance());
139 auto vendorWlanGroup = std::static_pointer_cast<VendorWlanGroup>(vendorManager.wlanGroupDriver);
140 auto vendorPpdDriver = vendorManager.FindDriverByVendorName(VENDOR_PPD_DRIVER);
141 if (vendorPpdDriver == nullptr) {
142 return;
143 }
144
145 std::string printerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
146 PrinterInfo printerInfo;
147 printerInfo.SetPrinterId(printerId);
148 printerInfo.SetPrinterName(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
149 std::string printerUri = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
150 printerInfo.SetPrinterMake(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
151 printerInfo.SetUri(printerUri);
152 printerInfo.SetOption(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
153 vendorWlanGroup->OnPrinterDiscovered(DEFAULT_VENDOR_NAME, printerInfo);
154
155 auto propertyKeys = std::vector<std::string>(1, printerInfo.GetPrinterMake());
156 vendorPpdDriver->OnQueryProperties(printerId, propertyKeys);
157 vendorPpdDriver->OnQueryCapability(printerId, DEFAULT_TIMEOUT);
158
159 vendorPpdDriver->vendorManager = nullptr;
160 vendorPpdDriver->OnQueryProperties(printerId, propertyKeys);
161 vendorPpdDriver->OnQueryCapability(printerId, DEFAULT_TIMEOUT);
162 }
163
TestPpdDriverOtherFunction(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)164 void TestPpdDriverOtherFunction(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
165 {
166 VendorManager vendorManager;
167 vendorManager.Init(PrintServiceAbility::GetInstance());
168 auto vendorWlanGroup = std::static_pointer_cast<VendorWlanGroup>(vendorManager.wlanGroupDriver);
169 auto vendorPpdDriver = std::make_shared<VendorPpdDriver>();
170 vendorPpdDriver->Init(&vendorManager);
171
172 std::string printerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
173 std::string ppdData = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
174 PrinterInfo printerInfo;
175 printerInfo.SetPrinterId(printerId);
176 printerInfo.SetPrinterName(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
177 printerInfo.SetUri(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
178 printerInfo.SetPrinterMake(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
179 printerInfo.SetOption(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
180 auto info = make_shared<PrinterInfo>(printerInfo);
181
182 // other function
183 std::string vendorName = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
184 std::string key = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
185 std::string value;
186 vendorPpdDriver->OnPrinterDiscovered(vendorName, printerInfo);
187 vendorPpdDriver->QueryProperty(printerId, key, value);
188
189 // other function without vendorManager
190 vendorPpdDriver->vendorManager = nullptr;
191 vendorPpdDriver->QueryProperty(printerId, key, value);
192 }
193
TestVendorWlanGroup(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)194 void TestVendorWlanGroup(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
195 {
196 TestWlanGroupDiscoverPrinterActions(data, size, dataProvider);
197 TestWlanGroupConnectPrinterActions(data, size, dataProvider);
198 TestWlanGroupOtherFunction(data, size, dataProvider);
199 }
200
TestVendorPpdDriver(const uint8_t * data,size_t size,FuzzedDataProvider * dataProvider)201 void TestVendorPpdDriver(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
202 {
203 TestPpdDriverConnectPrinterActions(data, size, dataProvider);
204 TestPpdDriverOtherFunction(data, size, dataProvider);
205 }
206
207 } // namespace Print
208 } // namespace OHOS
209
210 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)211 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
212 {
213 /* Run your code on data */
214 if (data == nullptr) {
215 return 0;
216 }
217
218 if (size < OHOS::Print::U32_AT_SIZE || size > OHOS::Print::FOO_MAX_LEN) {
219 return 0;
220 }
221
222 FuzzedDataProvider dataProvider(data, size);
223 OHOS::Print::PrintServiceAbilityMockPermission::MockPermission();
224 OHOS::Print::TestVendorWlanGroup(data, size, &dataProvider);
225 OHOS::Print::TestVendorPpdDriver(data, size, &dataProvider);
226 return 0;
227 }
228
229