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 #define private public
16 #define protected public
17 #include "printcupsclient_fuzzer.h"
18 #include "fuzzer/FuzzedDataProvider.h"
19 #include "print_constant.h"
20 #include "printer_capability.h"
21 #include "print_log.h"
22 #include "print_cups_client.h"
23
24 namespace OHOS {
25 namespace Print {
26 constexpr uint8_t MAX_STRING_LENGTH = 255;
27 constexpr int MAX_SET_NUMBER = 100;
28 constexpr size_t FOO_MAX_LEN = 1024;
29 constexpr size_t U32_AT_SIZE = 4;
30
TestQueryPPDInformation(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)31 void TestQueryPPDInformation(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
32 {
33 PrintCupsClient::GetInstance()->InitCupsResources();
34 std::string makeModelStr = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
35 std::string ppd = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
36 std::vector<std::string> ppds;
37 ppds.push_back(ppd);
38 PrintCupsClient::GetInstance()->QueryPPDInformation(makeModelStr.c_str(), ppds);
39 PrintCupsClient::GetInstance()->StopCupsdService();
40 }
41
TestAddPrinterToCups(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)42 void TestAddPrinterToCups(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
43 {
44 PrintCupsClient::GetInstance()->InitCupsResources();
45 std::string printerUri = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
46 std::string printerName = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
47 std::string printerMake = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
48 PrintCupsClient::GetInstance()->AddPrinterToCups(printerUri, printerName, printerMake);
49 PrintCupsClient::GetInstance()->JobCompleteCallback();
50 }
51
TestQueryPrinterCapabilityByUri(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)52 void TestQueryPrinterCapabilityByUri(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
53 {
54 PrintCupsClient::GetInstance()->InitCupsResources();
55 std::string printerUri = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
56 std::string printerName = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
57 PrinterCapability printerCaps;
58 PrintCupsClient::GetInstance()->QueryPrinterCapabilityByUri(printerUri, printerName, printerCaps);
59 }
60
TestDeleteCupsPrinter(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)61 void TestDeleteCupsPrinter(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
62 {
63 PrintCupsClient::GetInstance()->InitCupsResources();
64 std::string printerNameStr = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
65 PrintCupsClient::GetInstance()->DeleteCupsPrinter(printerNameStr.c_str());
66 }
67
TestAddCupsPrintJob(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)68 void TestAddCupsPrintJob(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
69 {
70 PrintCupsClient::GetInstance()->InitCupsResources();
71 PrintJob jobInfo;
72 std::string option = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
73 jobInfo.SetOption(option);
74 PrintCupsClient::GetInstance()->AddCupsPrintJob(jobInfo);
75 }
76
TestCancelCupsJob(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)77 void TestCancelCupsJob(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
78 {
79 PrintCupsClient::GetInstance()->InitCupsResources();
80 std::string serviceJobId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
81 PrintCupsClient::GetInstance()->CancelCupsJob(serviceJobId);
82 }
83
TestQueryAddedPrinterList(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)84 void TestQueryAddedPrinterList(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
85 {
86 PrintCupsClient::GetInstance()->InitCupsResources();
87 std::string printerNameStr = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
88 std::vector<std::string> printerName;
89 printerName.push_back(printerNameStr);
90 PrintCupsClient::GetInstance()->QueryAddedPrinterList(printerName);
91 }
92
TestGetPPDFile(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)93 void TestGetPPDFile(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
94 {
95 PrintCupsClient::GetInstance()->InitCupsResources();
96 std::string printerName = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
97 PrintCupsClient::GetInstance()->GetPPDFile(printerName);
98 }
99
TestSetDefaultPrinter(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)100 void TestSetDefaultPrinter(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
101 {
102 PrintCupsClient::GetInstance()->InitCupsResources();
103 std::string printerName = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
104 PrintCupsClient::GetInstance()->SetDefaultPrinter(printerName);
105 }
106
TestQueryPrinterAttrList(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)107 void TestQueryPrinterAttrList(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
108 {
109 PrintCupsClient::GetInstance()->InitCupsResources();
110 std::string printerName = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
111 std::string key = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
112 std::vector<std::string> keyList;
113 keyList.push_back(key);
114 std::string value = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
115 std::vector<std::string> valueList;
116 valueList.push_back(value);
117 PrintCupsClient::GetInstance()->QueryPrinterAttrList(printerName, keyList, valueList);
118 }
119
TestQueryPrinterInfoByPrinterId(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)120 void TestQueryPrinterInfoByPrinterId(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
121 {
122 PrintCupsClient::GetInstance()->InitCupsResources();
123 std::string printerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
124 PrinterInfo info;
125 PrintCupsClient::GetInstance()->QueryPrinterInfoByPrinterId(printerId, info);
126 }
127
TestCheckPrinterMakeModel(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)128 void TestCheckPrinterMakeModel(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
129 {
130 PrintCupsClient::GetInstance()->InitCupsResources();
131 JobParameters jobParams;
132 jobParams.printerUri = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
133 PrintCupsClient::GetInstance()->CheckPrinterMakeModel(&jobParams);
134 }
135
TestDeletePrinterFromCups(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)136 void TestDeletePrinterFromCups(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
137 {
138 PrintCupsClient::GetInstance()->InitCupsResources();
139 std::string printerName = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
140 PrintCupsClient::GetInstance()->DeleteCupsPrinter(printerName.c_str());
141 }
142
TestCheckPrinterOnline(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)143 void TestCheckPrinterOnline(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
144 {
145 JobMonitorParam monitorParam;
146 monitorParam.printerUri = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
147 monitorParam.printerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
148 PrintCupsClient::GetInstance()->CheckPrinterOnline(&monitorParam);
149 }
150
TestGetIpAddress(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)151 void TestGetIpAddress(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
152 {
153 unsigned int number = dataProvider->ConsumeIntegralInRange<unsigned int>(0, MAX_SET_NUMBER);
154 PrintCupsClient::GetInstance()->GetIpAddress(number);
155 }
156
TestIsIpConflict(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)157 void TestIsIpConflict(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
158 {
159 std::string printerId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
160 std::string nic = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
161 PrintCupsClient::GetInstance()->IsIpConflict(printerId, nic);
162 }
163
TestConvertInchTo100MM(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)164 void TestConvertInchTo100MM(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
165 {
166 int num = dataProvider->ConsumeIntegralInRange<int>(0, MAX_SET_NUMBER);
167 PrintCupsClient::GetInstance()->ConvertInchTo100MM(num);
168 }
169
TestGetColorString(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)170 void TestGetColorString(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
171 {
172 uint32_t colorCode = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER);
173 PrintCupsClient::GetInstance()->GetColorString(colorCode);
174 }
175
TestGetDulpexString(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)176 void TestGetDulpexString(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
177 {
178 uint32_t duplexCode = dataProvider->ConsumeIntegralInRange<uint32_t>(0, MAX_SET_NUMBER);
179 PrintCupsClient::GetInstance()->GetDulpexString(duplexCode);
180 }
181
TestGetMedieSize(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)182 void TestGetMedieSize(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
183 {
184 PrintJob printJob;
185 printJob.SetJobId(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
186 printJob.SetPrinterId(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
187 PrintCupsClient::GetInstance()->GetMedieSize(printJob);
188 }
189
TestDumpJobParameters(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)190 void TestDumpJobParameters(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
191 {
192 JobParameters jobParams;
193 jobParams.serviceJobId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
194 PrintCupsClient::GetInstance()->DumpJobParameters(&jobParams);
195 }
196
TestBuildJobParameters(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)197 void TestBuildJobParameters(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
198 {
199 PrintJob printJob;
200 printJob.SetJobId(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
201 printJob.SetPrinterId(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
202 printJob.SetOption(dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH));
203 PrintCupsClient::GetInstance()->BuildJobParameters(printJob);
204 }
205
TestQueryJobState(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)206 void TestQueryJobState(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
207 {
208 http_t *http;
209 JobMonitorParam param;
210 param.serviceJobId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
211 JobStatus jobStatus;
212 PrintCupsClient::GetInstance()->QueryJobState(http, ¶m, &jobStatus);
213 }
214
TestGetBlockedSubstate(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)215 void TestGetBlockedSubstate(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
216 {
217 JobStatus jobStatus;
218 std::string printerReason = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
219 printerReason.copy(jobStatus.printer_state_reasons, printerReason.length() + 1);
220 PrintCupsClient::GetInstance()->GetBlockedSubstate(&jobStatus);
221 }
222
TestReportBlockedReason(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)223 void TestReportBlockedReason(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
224 {
225 JobMonitorParam param;
226 param.serviceJobId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
227 JobStatus jobStatus;
228 std::string printerReason = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
229 printerReason.copy(jobStatus.printer_state_reasons, printerReason.length() + 1);
230 PrintCupsClient::GetInstance()->ReportBlockedReason(¶m, &jobStatus);
231 }
232
TestJobStatusCallback(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)233 void TestJobStatusCallback(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
234 {
235 JobMonitorParam param;
236 param.serviceJobId = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
237 JobStatus jobStatus;
238 std::string printerReason = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
239 printerReason.copy(jobStatus.printer_state_reasons, printerReason.length() + 1);
240 bool isOffline = dataProvider->ConsumeBool();
241 PrintCupsClient::GetInstance()->JobStatusCallback(¶m, &jobStatus, isOffline);
242 }
243
TestUpdateJobStatus(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)244 void TestUpdateJobStatus(const uint8_t *data, size_t size, FuzzedDataProvider *dataProvider)
245 {
246 JobStatus prevousJobStatus;
247 std::string prevousPrinterReason = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
248 prevousPrinterReason.copy(prevousJobStatus.printer_state_reasons, prevousPrinterReason.length() + 1);
249 JobStatus jobStatus;
250 std::string printerReason = dataProvider->ConsumeRandomLengthString(MAX_STRING_LENGTH);
251 printerReason.copy(jobStatus.printer_state_reasons, printerReason.length() + 1);
252 PrintCupsClient::GetInstance()->UpdateJobStatus(&prevousJobStatus, &jobStatus);
253 }
254
255 } // namespace Print
256 } // namespace OHOS
257
258 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)259 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
260 {
261 /* Run your code on data */
262 if (data == nullptr) {
263 return 0;
264 }
265
266 if (size < OHOS::Print::U32_AT_SIZE || size > OHOS::Print::FOO_MAX_LEN) {
267 }
268
269 FuzzedDataProvider dataProvider(data, size);
270 OHOS::Print::TestQueryPPDInformation(data, size, &dataProvider);
271 OHOS::Print::TestAddPrinterToCups(data, size, &dataProvider);
272 OHOS::Print::TestQueryPrinterCapabilityByUri(data, size, &dataProvider);
273 OHOS::Print::TestDeleteCupsPrinter(data, size, &dataProvider);
274 OHOS::Print::TestAddCupsPrintJob(data, size, &dataProvider);
275 OHOS::Print::TestCancelCupsJob(data, size, &dataProvider);
276 OHOS::Print::TestQueryAddedPrinterList(data, size, &dataProvider);
277 OHOS::Print::TestGetPPDFile(data, size, &dataProvider);
278 OHOS::Print::TestSetDefaultPrinter(data, size, &dataProvider);
279 OHOS::Print::TestQueryPrinterAttrList(data, size, &dataProvider);
280 OHOS::Print::TestQueryPrinterInfoByPrinterId(data, size, &dataProvider);
281 OHOS::Print::TestCheckPrinterMakeModel(data, size, &dataProvider);
282 OHOS::Print::TestDeletePrinterFromCups(data, size, &dataProvider);
283 OHOS::Print::TestCheckPrinterOnline(data, size, &dataProvider);
284 OHOS::Print::TestGetIpAddress(data, size, &dataProvider);
285 OHOS::Print::TestIsIpConflict(data, size, &dataProvider);
286 OHOS::Print::TestConvertInchTo100MM(data, size, &dataProvider);
287 OHOS::Print::TestGetColorString(data, size, &dataProvider);
288 OHOS::Print::TestGetDulpexString(data, size, &dataProvider);
289 OHOS::Print::TestGetMedieSize(data, size, &dataProvider);
290 OHOS::Print::TestDumpJobParameters(data, size, &dataProvider);
291 OHOS::Print::TestBuildJobParameters(data, size, &dataProvider);
292 OHOS::Print::TestQueryJobState(data, size, &dataProvider);
293 OHOS::Print::TestGetBlockedSubstate(data, size, &dataProvider);
294 OHOS::Print::TestReportBlockedReason(data, size, &dataProvider);
295 OHOS::Print::TestJobStatusCallback(data, size, &dataProvider);
296 OHOS::Print::TestUpdateJobStatus(data, size, &dataProvider);
297
298 return 0;
299 }
300