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 #include "formdatamgrthree_fuzzer.h"
17
18 #include <cstddef>
19 #include <cstdint>
20
21 #define private public
22 #define protected public
23 #include "data_center/form_data_mgr.h"
24 #undef private
25 #undef protected
26 #include "securec.h"
27
28 using namespace OHOS::AppExecFwk;
29
30 namespace OHOS {
31 constexpr size_t U32_AT_SIZE = 4;
32 constexpr uint8_t ENABLE = 2;
GetU32Data(const char * ptr)33 uint32_t GetU32Data(const char* ptr)
34 {
35 // convert fuzz input data to an integer
36 return (ptr[0] << 24) | (ptr[1] << 16) | (ptr[2] << 8) | ptr[3];
37 }
DoSomethingInterestingWithMyAPI(const char * data,size_t size)38 bool DoSomethingInterestingWithMyAPI(const char* data, size_t size)
39 {
40 FormDataMgr formDataMgr;
41 int64_t formId = static_cast<int64_t>(GetU32Data(data));
42 bool versionUpgrade = *data % ENABLE;
43 formDataMgr.SetVersionUpgrade(formId, versionUpgrade);
44 FormRecord formRecord;
45 formDataMgr.UpdateHostForm(formId, formRecord);
46 std::vector<int64_t> formIds;
47 formIds.emplace_back(formId);
48 bool flag = *data % ENABLE;
49 bool isOnlyEnableUpdate = *data % ENABLE;
50 FormHostRecord formHostRecord;
51 std::vector<int64_t> refreshForms;
52 refreshForms.emplace_back(formId);
53 formDataMgr.HandleUpdateHostFormFlag(formIds, flag, isOnlyEnableUpdate, formHostRecord, refreshForms);
54 sptr<IRemoteObject> callerToken = nullptr;
55 formDataMgr.UpdateHostFormFlag(formIds, callerToken, flag, isOnlyEnableUpdate, refreshForms);
56 formDataMgr.FindMatchedFormId(formId);
57 int uId = static_cast<int>(GetU32Data(data));
58 formDataMgr.ClearHostDataByUId(uId);
59 std::map<FormIdKey, std::set<int64_t>> noHostTempFormsMap;
60 std::string bundleName(data, size);
61 std::string abilityName(data, size);
62 FormIdKey formIdKey(bundleName, abilityName);
63 std::set<int64_t> aa;
64 aa.insert(formId);
65 noHostTempFormsMap.emplace(formIdKey, aa);
66 std::map<int64_t, bool> foundFormsMap;
67 foundFormsMap.emplace(formId, flag);
68 formDataMgr.GetNoHostTempForms(uId, noHostTempFormsMap, foundFormsMap);
69 FormItemInfo info;
70 formDataMgr.ParseUpdateConfig(formRecord, info);
71 int configDuration = static_cast<int>(GetU32Data(data));
72 formDataMgr.ParseIntervalConfig(formRecord, configDuration);
73 formDataMgr.ParseAtTimerConfig(formRecord, info);
74 formDataMgr.IsFormCached(formRecord);
75 std::string provider(data, size);
76 int callingUid = static_cast<int>(GetU32Data(data));
77 formDataMgr.CreateFormStateRecord(provider, info, callerToken, callingUid);
78 bool isVisible = *data % ENABLE;
79 formDataMgr.NotifyFormsVisible(formIds, isVisible, callerToken);
80 int64_t matchedFormId = static_cast<int64_t>(GetU32Data(data));
81 formDataMgr.SetRecordVisible(matchedFormId, isVisible);
82 return true;
83 }
84
DoSomethingInterestingWithMyAPI1(const char * data,size_t size)85 bool DoSomethingInterestingWithMyAPI1(const char* data, size_t size)
86 {
87 FormDataMgr formDataMgr;
88 int64_t formId = static_cast<int64_t>(GetU32Data(data));
89 bool versionUpgrade = *data % ENABLE;
90 formDataMgr.SetVersionUpgrade(formId, versionUpgrade);
91 FormRecord formRecord;
92 formDataMgr.UpdateHostForm(formId, formRecord);
93 std::vector<int64_t> formIds;
94 formIds.emplace_back(formId);
95 bool flag = *data % ENABLE;
96 bool isOnlyEnableUpdate = *data % ENABLE;
97 FormHostRecord formHostRecord;
98 std::vector<int64_t> refreshForms;
99 refreshForms.emplace_back(formId);
100 formDataMgr.HandleUpdateHostFormFlag(formIds, flag, isOnlyEnableUpdate, formHostRecord, refreshForms);
101 sptr<IRemoteObject> callerToken = nullptr;
102 formDataMgr.UpdateHostFormFlag(formIds, callerToken, flag, isOnlyEnableUpdate, refreshForms);
103 formDataMgr.FindMatchedFormId(formId);
104 int uId = static_cast<int>(GetU32Data(data));
105 formDataMgr.ClearHostDataByUId(uId);
106 std::map<FormIdKey, std::set<int64_t>> noHostTempFormsMap;
107 std::string bundleName(data, size);
108 std::string abilityName(data, size);
109 FormIdKey formIdKey(bundleName, abilityName);
110 std::set<int64_t> aa;
111 aa.insert(formId);
112 noHostTempFormsMap.emplace(formIdKey, aa);
113 std::map<int64_t, bool> foundFormsMap;
114 foundFormsMap.emplace(formId, flag);
115 formDataMgr.GetNoHostTempForms(uId, noHostTempFormsMap, foundFormsMap);
116 FormItemInfo info;
117 formDataMgr.ParseUpdateConfig(formRecord, info);
118 int configDuration = static_cast<int>(GetU32Data(data));
119 formDataMgr.ParseIntervalConfig(formRecord, configDuration);
120 formDataMgr.ParseAtTimerConfig(formRecord, info);
121 formDataMgr.IsFormCached(formRecord);
122 std::string provider(data, size);
123 int callingUid = static_cast<int>(GetU32Data(data));
124 formDataMgr.CreateFormStateRecord(provider, info, callerToken, callingUid);
125 bool isVisible = *data % ENABLE;
126 formDataMgr.NotifyFormsVisible(formIds, isVisible, callerToken);
127 int64_t matchedFormId = static_cast<int64_t>(GetU32Data(data));
128 formDataMgr.SetRecordVisible(matchedFormId, isVisible);
129 return true;
130 }
131
DoSomethingInterestingWithMyAPI2(const char * data,size_t size)132 bool DoSomethingInterestingWithMyAPI2(const char* data, size_t size)
133 {
134 FormDataMgr formDataMgr;
135 int64_t formId = static_cast<int64_t>(GetU32Data(data));
136 bool versionUpgrade = *data % ENABLE;
137 formDataMgr.SetVersionUpgrade(formId, versionUpgrade);
138 FormRecord formRecord;
139 formDataMgr.UpdateHostForm(formId, formRecord);
140 std::vector<int64_t> formIds;
141 formIds.emplace_back(formId);
142 bool flag = *data % ENABLE;
143 bool isOnlyEnableUpdate = *data % ENABLE;
144 FormHostRecord formHostRecord;
145 std::vector<int64_t> refreshForms;
146 refreshForms.emplace_back(formId);
147 formDataMgr.HandleUpdateHostFormFlag(formIds, flag, isOnlyEnableUpdate, formHostRecord, refreshForms);
148 sptr<IRemoteObject> callerToken = nullptr;
149 formDataMgr.UpdateHostFormFlag(formIds, callerToken, flag, isOnlyEnableUpdate, refreshForms);
150 formDataMgr.FindMatchedFormId(formId);
151 int uId = static_cast<int>(GetU32Data(data));
152 formDataMgr.ClearHostDataByUId(uId);
153 std::map<FormIdKey, std::set<int64_t>> noHostTempFormsMap;
154 std::string bundleName(data, size);
155 std::string abilityName(data, size);
156 FormIdKey formIdKey(bundleName, abilityName);
157 std::set<int64_t> aa;
158 aa.insert(formId);
159 noHostTempFormsMap.emplace(formIdKey, aa);
160 std::map<int64_t, bool> foundFormsMap;
161 foundFormsMap.emplace(formId, flag);
162 formDataMgr.GetNoHostTempForms(uId, noHostTempFormsMap, foundFormsMap);
163 FormItemInfo info;
164 formDataMgr.ParseUpdateConfig(formRecord, info);
165 int configDuration = static_cast<int>(GetU32Data(data));
166 formDataMgr.ParseIntervalConfig(formRecord, configDuration);
167 formDataMgr.ParseAtTimerConfig(formRecord, info);
168 formDataMgr.IsFormCached(formRecord);
169 std::string provider(data, size);
170 int callingUid = static_cast<int>(GetU32Data(data));
171 formDataMgr.CreateFormStateRecord(provider, info, callerToken, callingUid);
172 bool isVisible = *data % ENABLE;
173 formDataMgr.NotifyFormsVisible(formIds, isVisible, callerToken);
174 int64_t matchedFormId = static_cast<int64_t>(GetU32Data(data));
175 formDataMgr.SetRecordVisible(matchedFormId, isVisible);
176 return true;
177 }
178
DoSomethingInterestingWithMyAPI3(const char * data,size_t size)179 bool DoSomethingInterestingWithMyAPI3(const char* data, size_t size)
180 {
181 FormDataMgr formDataMgr;
182 int64_t formId = static_cast<int64_t>(GetU32Data(data));
183 bool versionUpgrade = *data % ENABLE;
184 formDataMgr.SetVersionUpgrade(formId, versionUpgrade);
185 FormRecord formRecord;
186 formDataMgr.UpdateHostForm(formId, formRecord);
187 std::vector<int64_t> formIds;
188 formIds.emplace_back(formId);
189 bool flag = *data % ENABLE;
190 bool isOnlyEnableUpdate = *data % ENABLE;
191 FormHostRecord formHostRecord;
192 std::vector<int64_t> refreshForms;
193 refreshForms.emplace_back(formId);
194 formDataMgr.HandleUpdateHostFormFlag(formIds, flag, isOnlyEnableUpdate, formHostRecord, refreshForms);
195 sptr<IRemoteObject> callerToken = nullptr;
196 formDataMgr.UpdateHostFormFlag(formIds, callerToken, flag, isOnlyEnableUpdate, refreshForms);
197 formDataMgr.FindMatchedFormId(formId);
198 int uId = static_cast<int>(GetU32Data(data));
199 formDataMgr.ClearHostDataByUId(uId);
200 std::map<FormIdKey, std::set<int64_t>> noHostTempFormsMap;
201 std::string bundleName(data, size);
202 std::string abilityName(data, size);
203 FormIdKey formIdKey(bundleName, abilityName);
204 std::set<int64_t> aa;
205 aa.insert(formId);
206 noHostTempFormsMap.emplace(formIdKey, aa);
207 std::map<int64_t, bool> foundFormsMap;
208 foundFormsMap.emplace(formId, flag);
209 formDataMgr.GetNoHostTempForms(uId, noHostTempFormsMap, foundFormsMap);
210 FormItemInfo info;
211 formDataMgr.ParseUpdateConfig(formRecord, info);
212 int configDuration = static_cast<int>(GetU32Data(data));
213 formDataMgr.ParseIntervalConfig(formRecord, configDuration);
214 formDataMgr.ParseAtTimerConfig(formRecord, info);
215 formDataMgr.IsFormCached(formRecord);
216 std::string provider(data, size);
217 int callingUid = static_cast<int>(GetU32Data(data));
218 formDataMgr.CreateFormStateRecord(provider, info, callerToken, callingUid);
219 bool isVisible = *data % ENABLE;
220 formDataMgr.NotifyFormsVisible(formIds, isVisible, callerToken);
221 int64_t matchedFormId = static_cast<int64_t>(GetU32Data(data));
222 formDataMgr.SetRecordVisible(matchedFormId, isVisible);
223 return true;
224 }
225
DoSomethingInterestingWithMyAPI4(const char * data,size_t size)226 bool DoSomethingInterestingWithMyAPI4(const char* data, size_t size)
227 {
228 FormDataMgr formDataMgr;
229 int64_t formId = static_cast<int64_t>(GetU32Data(data));
230 bool versionUpgrade = *data % ENABLE;
231 formDataMgr.SetVersionUpgrade(formId, versionUpgrade);
232 FormRecord formRecord;
233 formDataMgr.UpdateHostForm(formId, formRecord);
234 std::vector<int64_t> formIds;
235 formIds.emplace_back(formId);
236 bool flag = *data % ENABLE;
237 bool isOnlyEnableUpdate = *data % ENABLE;
238 FormHostRecord formHostRecord;
239 std::vector<int64_t> refreshForms;
240 refreshForms.emplace_back(formId);
241 formDataMgr.HandleUpdateHostFormFlag(formIds, flag, isOnlyEnableUpdate, formHostRecord, refreshForms);
242 sptr<IRemoteObject> callerToken = nullptr;
243 formDataMgr.UpdateHostFormFlag(formIds, callerToken, flag, isOnlyEnableUpdate, refreshForms);
244 formDataMgr.FindMatchedFormId(formId);
245 int uId = static_cast<int>(GetU32Data(data));
246 formDataMgr.ClearHostDataByUId(uId);
247 std::map<FormIdKey, std::set<int64_t>> noHostTempFormsMap;
248 std::string bundleName(data, size);
249 std::string abilityName(data, size);
250 FormIdKey formIdKey(bundleName, abilityName);
251 std::set<int64_t> aa;
252 aa.insert(formId);
253 noHostTempFormsMap.emplace(formIdKey, aa);
254 std::map<int64_t, bool> foundFormsMap;
255 foundFormsMap.emplace(formId, flag);
256 formDataMgr.GetNoHostTempForms(uId, noHostTempFormsMap, foundFormsMap);
257 FormItemInfo info;
258 formDataMgr.ParseUpdateConfig(formRecord, info);
259 int configDuration = static_cast<int>(GetU32Data(data));
260 formDataMgr.ParseIntervalConfig(formRecord, configDuration);
261 formDataMgr.ParseAtTimerConfig(formRecord, info);
262 formDataMgr.IsFormCached(formRecord);
263 std::string provider(data, size);
264 int callingUid = static_cast<int>(GetU32Data(data));
265 formDataMgr.CreateFormStateRecord(provider, info, callerToken, callingUid);
266 bool isVisible = *data % ENABLE;
267 formDataMgr.NotifyFormsVisible(formIds, isVisible, callerToken);
268 int64_t matchedFormId = static_cast<int64_t>(GetU32Data(data));
269 formDataMgr.SetRecordVisible(matchedFormId, isVisible);
270 return true;
271 }
272
DoSomethingInterestingWithMyAPI5(const char * data,size_t size)273 bool DoSomethingInterestingWithMyAPI5(const char* data, size_t size)
274 {
275 FormDataMgr formDataMgr;
276 int64_t formId = static_cast<int64_t>(GetU32Data(data));
277 bool versionUpgrade = *data % ENABLE;
278 formDataMgr.SetVersionUpgrade(formId, versionUpgrade);
279 FormRecord formRecord;
280 formDataMgr.UpdateHostForm(formId, formRecord);
281 std::vector<int64_t> formIds;
282 formIds.emplace_back(formId);
283 bool flag = *data % ENABLE;
284 bool isOnlyEnableUpdate = *data % ENABLE;
285 FormHostRecord formHostRecord;
286 std::vector<int64_t> refreshForms;
287 refreshForms.emplace_back(formId);
288 formDataMgr.HandleUpdateHostFormFlag(formIds, flag, isOnlyEnableUpdate, formHostRecord, refreshForms);
289 sptr<IRemoteObject> callerToken = nullptr;
290 formDataMgr.UpdateHostFormFlag(formIds, callerToken, flag, isOnlyEnableUpdate, refreshForms);
291 formDataMgr.FindMatchedFormId(formId);
292 int uId = static_cast<int>(GetU32Data(data));
293 formDataMgr.ClearHostDataByUId(uId);
294 std::map<FormIdKey, std::set<int64_t>> noHostTempFormsMap;
295 std::string bundleName(data, size);
296 std::string abilityName(data, size);
297 FormIdKey formIdKey(bundleName, abilityName);
298 std::set<int64_t> aa;
299 aa.insert(formId);
300 noHostTempFormsMap.emplace(formIdKey, aa);
301 std::map<int64_t, bool> foundFormsMap;
302 foundFormsMap.emplace(formId, flag);
303 formDataMgr.GetNoHostTempForms(uId, noHostTempFormsMap, foundFormsMap);
304 FormItemInfo info;
305 formDataMgr.ParseUpdateConfig(formRecord, info);
306 int configDuration = static_cast<int>(GetU32Data(data));
307 formDataMgr.ParseIntervalConfig(formRecord, configDuration);
308 formDataMgr.ParseAtTimerConfig(formRecord, info);
309 formDataMgr.IsFormCached(formRecord);
310 std::string provider(data, size);
311 int callingUid = static_cast<int>(GetU32Data(data));
312 formDataMgr.CreateFormStateRecord(provider, info, callerToken, callingUid);
313 bool isVisible = *data % ENABLE;
314 formDataMgr.NotifyFormsVisible(formIds, isVisible, callerToken);
315 int64_t matchedFormId = static_cast<int64_t>(GetU32Data(data));
316 formDataMgr.SetRecordVisible(matchedFormId, isVisible);
317 return true;
318 }
319
DoSomethingInterestingWithMyAPI6(const char * data,size_t size)320 bool DoSomethingInterestingWithMyAPI6(const char* data, size_t size)
321 {
322 FormDataMgr formDataMgr;
323 int64_t formId = static_cast<int64_t>(GetU32Data(data));
324 bool versionUpgrade = *data % ENABLE;
325 formDataMgr.SetVersionUpgrade(formId, versionUpgrade);
326 FormRecord formRecord;
327 formDataMgr.UpdateHostForm(formId, formRecord);
328 std::vector<int64_t> formIds;
329 formIds.emplace_back(formId);
330 bool flag = *data % ENABLE;
331 bool isOnlyEnableUpdate = *data % ENABLE;
332 FormHostRecord formHostRecord;
333 std::vector<int64_t> refreshForms;
334 refreshForms.emplace_back(formId);
335 formDataMgr.HandleUpdateHostFormFlag(formIds, flag, isOnlyEnableUpdate, formHostRecord, refreshForms);
336 sptr<IRemoteObject> callerToken = nullptr;
337 formDataMgr.UpdateHostFormFlag(formIds, callerToken, flag, isOnlyEnableUpdate, refreshForms);
338 formDataMgr.FindMatchedFormId(formId);
339 int uId = static_cast<int>(GetU32Data(data));
340 formDataMgr.ClearHostDataByUId(uId);
341 std::map<FormIdKey, std::set<int64_t>> noHostTempFormsMap;
342 std::string bundleName(data, size);
343 std::string abilityName(data, size);
344 FormIdKey formIdKey(bundleName, abilityName);
345 std::set<int64_t> aa;
346 aa.insert(formId);
347 noHostTempFormsMap.emplace(formIdKey, aa);
348 std::map<int64_t, bool> foundFormsMap;
349 foundFormsMap.emplace(formId, flag);
350 formDataMgr.GetNoHostTempForms(uId, noHostTempFormsMap, foundFormsMap);
351 FormItemInfo info;
352 formDataMgr.ParseUpdateConfig(formRecord, info);
353 int configDuration = static_cast<int>(GetU32Data(data));
354 formDataMgr.ParseIntervalConfig(formRecord, configDuration);
355 formDataMgr.ParseAtTimerConfig(formRecord, info);
356 formDataMgr.IsFormCached(formRecord);
357 std::string provider(data, size);
358 int callingUid = static_cast<int>(GetU32Data(data));
359 formDataMgr.CreateFormStateRecord(provider, info, callerToken, callingUid);
360 bool isVisible = *data % ENABLE;
361 formDataMgr.NotifyFormsVisible(formIds, isVisible, callerToken);
362 int64_t matchedFormId = static_cast<int64_t>(GetU32Data(data));
363 formDataMgr.SetRecordVisible(matchedFormId, isVisible);
364 return true;
365 }
366
DoSomethingInterestingWithMyAPI7(const char * data,size_t size)367 bool DoSomethingInterestingWithMyAPI7(const char* data, size_t size)
368 {
369 FormDataMgr formDataMgr;
370 int64_t formId = static_cast<int64_t>(GetU32Data(data));
371 bool versionUpgrade = *data % ENABLE;
372 formDataMgr.SetVersionUpgrade(formId, versionUpgrade);
373 FormRecord formRecord;
374 formDataMgr.UpdateHostForm(formId, formRecord);
375 std::vector<int64_t> formIds;
376 formIds.emplace_back(formId);
377 bool flag = *data % ENABLE;
378 bool isOnlyEnableUpdate = *data % ENABLE;
379 FormHostRecord formHostRecord;
380 std::vector<int64_t> refreshForms;
381 refreshForms.emplace_back(formId);
382 formDataMgr.HandleUpdateHostFormFlag(formIds, flag, isOnlyEnableUpdate, formHostRecord, refreshForms);
383 sptr<IRemoteObject> callerToken = nullptr;
384 formDataMgr.UpdateHostFormFlag(formIds, callerToken, flag, isOnlyEnableUpdate, refreshForms);
385 formDataMgr.FindMatchedFormId(formId);
386 int uId = static_cast<int>(GetU32Data(data));
387 formDataMgr.ClearHostDataByUId(uId);
388 std::map<FormIdKey, std::set<int64_t>> noHostTempFormsMap;
389 std::string bundleName(data, size);
390 std::string abilityName(data, size);
391 FormIdKey formIdKey(bundleName, abilityName);
392 std::set<int64_t> aa;
393 aa.insert(formId);
394 noHostTempFormsMap.emplace(formIdKey, aa);
395 std::map<int64_t, bool> foundFormsMap;
396 foundFormsMap.emplace(formId, flag);
397 formDataMgr.GetNoHostTempForms(uId, noHostTempFormsMap, foundFormsMap);
398 FormItemInfo info;
399 formDataMgr.ParseUpdateConfig(formRecord, info);
400 int configDuration = static_cast<int>(GetU32Data(data));
401 formDataMgr.ParseIntervalConfig(formRecord, configDuration);
402 formDataMgr.ParseAtTimerConfig(formRecord, info);
403 formDataMgr.IsFormCached(formRecord);
404 std::string provider(data, size);
405 int callingUid = static_cast<int>(GetU32Data(data));
406 formDataMgr.CreateFormStateRecord(provider, info, callerToken, callingUid);
407 bool isVisible = *data % ENABLE;
408 formDataMgr.NotifyFormsVisible(formIds, isVisible, callerToken);
409 int64_t matchedFormId = static_cast<int64_t>(GetU32Data(data));
410 formDataMgr.SetRecordVisible(matchedFormId, isVisible);
411 return true;
412 }
413 }
414
415 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)416 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
417 {
418 /* Run your code on data */
419 if (data == nullptr) {
420 return 0;
421 }
422
423 if (size < OHOS::U32_AT_SIZE) {
424 return 0;
425 }
426
427 char* ch = reinterpret_cast<char *>(malloc(size + 1));
428 if (ch == nullptr) {
429 return 0;
430 }
431
432 (void)memset_s(ch, size + 1, 0x00, size + 1);
433 if (memcpy_s(ch, size + 1, data, size) != EOK) {
434 free(ch);
435 ch = nullptr;
436 return 0;
437 }
438
439 OHOS::DoSomethingInterestingWithMyAPI(ch, size);
440 free(ch);
441 ch = nullptr;
442 return 0;
443 }
444
445