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