1 /*
2 * Copyright (c) 2024-2025 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 "backupservicestubbranch_fuzzer.h"
17
18 #include <string>
19 #include <queue>
20
21 #include "b_incremental_data.h"
22 #include "b_session_backup.h"
23 #include "b_session_restore.h"
24 #include "message_parcel.h"
25 #include "refbase.h"
26 #include "service.h"
27 #include "service_reverse.h"
28
29 namespace OHOS {
30 using namespace FileManagement::Backup;
31 using namespace std;
32
33 using FAFVariant = std::variant<bool, int32_t, int64_t, uint32_t, std::string, std::vector<std::string>>;
34
35 list<FAFVariant> que;
36 list<FAFVariant> arg;
37
ExpectReturn(list<FAFVariant> && value)38 void ExpectReturn(list<FAFVariant>&& value)
39 {
40 std::swap(que, value);
41 }
42
ExpectArgReturn(list<FAFVariant> && value)43 void ExpectArgReturn(list<FAFVariant>&& value)
44 {
45 std::swap(arg, value);
46 }
47
GetBoolResult()48 bool GetBoolResult()
49 {
50 bool ret = true;
51 if (!que.empty()) {
52 ret = std::get<bool>(que.front());
53 que.pop_front();
54 }
55 return ret;
56 }
57
Parcelable()58 Parcelable::Parcelable() : Parcelable(false)
59 {}
60
Parcelable(bool asRemote)61 Parcelable::Parcelable(bool asRemote)
62 {
63 asRemote_ = asRemote;
64 behavior_ = 0;
65 }
66
67 template <typename T>
Write(T value)68 bool Parcel::Write(T value)
69 {
70 size_t desireCapacity = sizeof(T);
71
72 if (EnsureWritableCapacity(desireCapacity)) {
73 *reinterpret_cast<T *>(data_ + writeCursor_) = value;
74 writeCursor_ += desireCapacity;
75 dataSize_ += desireCapacity;
76 return true;
77 }
78
79 return false;
80 }
81
WriteParcelable(const Parcelable * object)82 bool Parcel::WriteParcelable(const Parcelable *object)
83 {
84 if (object == nullptr) {
85 return WriteInt32(0);
86 }
87
88 if (!object->asRemote_) {
89 bool flag = WriteInt32(1);
90 object->Marshalling(*this);
91 return flag;
92 }
93
94 bool flag = WriteInt32(1);
95 WriteRemoteObject(const_cast<Parcelable*>(object));
96 return flag;
97 }
98
WriteInt32(int32_t value)99 bool Parcel::WriteInt32(int32_t value)
100 {
101 Write<int32_t>(value);
102 return GetBoolResult();
103 }
104
WriteUint32(uint32_t value)105 bool Parcel::WriteUint32(uint32_t value)
106 {
107 Write<uint32_t>(value);
108 return GetBoolResult();
109 }
110
ReadInt32()111 int32_t Parcel::ReadInt32()
112 {
113 int32_t ret = 0;
114 if (!que.empty()) {
115 ret = std::get<int32_t>(que.front());
116 que.pop_front();
117 }
118 return ret;
119 }
120
ReadInt32(int32_t & value)121 bool Parcel::ReadInt32(int32_t &value)
122 {
123 if (!arg.empty()) {
124 value = std::get<int32_t>(arg.front());
125 arg.pop_front();
126 }
127 return GetBoolResult();
128 }
129
ReadBool()130 bool Parcel::ReadBool()
131 {
132 return GetBoolResult();
133 }
134
ReadBool(bool & value)135 bool Parcel::ReadBool(bool &value)
136 {
137 if (!arg.empty()) {
138 value = std::get<bool>(arg.front());
139 arg.pop_front();
140 }
141 return GetBoolResult();
142 }
143
WriteBool(bool value)144 bool Parcel::WriteBool(bool value)
145 {
146 return GetBoolResult();
147 }
148
WriteString(const std::string & value)149 bool Parcel::WriteString(const std::string &value)
150 {
151 return GetBoolResult();
152 }
153
ReadString(std::string & value)154 bool Parcel::ReadString(std::string &value)
155 {
156 if (!arg.empty()) {
157 value = std::get<string>(arg.front());
158 arg.pop_front();
159 }
160 return GetBoolResult();
161 }
162
ReadStringVector(std::vector<std::string> * value)163 bool Parcel::ReadStringVector(std::vector<std::string> *value)
164 {
165 if (!arg.empty()) {
166 *value = std::get<std::vector<std::string>>(arg.front());
167 arg.pop_front();
168 }
169 return GetBoolResult();
170 }
171
WriteFileDescriptor(int fd)172 bool MessageParcel::WriteFileDescriptor(int fd)
173 {
174 return GetBoolResult();
175 }
176
ReadFileDescriptor()177 int MessageParcel::ReadFileDescriptor()
178 {
179 int32_t ret = 0;
180 if (!que.empty()) {
181 ret = std::get<int32_t>(que.front());
182 que.pop_front();
183 }
184 return ret;
185 }
186
ReadUint32(uint32_t & value)187 bool Parcel::ReadUint32(uint32_t &value)
188 {
189 if (!arg.empty()) {
190 value = std::get<uint32_t>(arg.front());
191 arg.pop_front();
192 }
193 return GetBoolResult();
194 }
195
196
197 template<class T>
TypeCast(const uint8_t * data,int * pos=nullptr)198 T TypeCast(const uint8_t *data, int *pos = nullptr)
199 {
200 if (pos) {
201 *pos += sizeof(T);
202 }
203 return *(reinterpret_cast<const T*>(data));
204 }
205
OnRemoteRequestFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)206 bool OnRemoteRequestFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
207 {
208 if (data == nullptr || size < sizeof(uint32_t)) {
209 return true;
210 }
211
212 MessageParcel msg;
213 MessageParcel reply;
214 MessageOption option;
215 uint32_t code = TypeCast<uint32_t>(data);
216
217 service->OnRemoteRequest(code, msg, reply, option);
218
219 msg.WriteInterfaceToken(ServiceStub::GetDescriptor());
220 service->OnRemoteRequest(code, msg, reply, option);
221 return true;
222 }
223
CmdInitRestoreSessionFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)224 bool CmdInitRestoreSessionFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
225 {
226 MessageParcel msg;
227 MessageParcel reply;
228
229 try {
230 msg.WriteBuffer(data, size);
231 service->CmdInitRestoreSession(msg, reply);
232
233 BSessionRestore::Callbacks callbacks;
234 msg.WriteRemoteObject(new ServiceReverse(callbacks));
235 ExpectReturn({false});
236 service->CmdInitRestoreSession(msg, reply);
237
238 msg.FlushBuffer();
239 msg.WriteRemoteObject(new ServiceReverse(callbacks));
240 ExpectReturn({true});
241 service->CmdInitRestoreSession(msg, reply);
242 } catch (OHOS::FileManagement::Backup::BError &err) {
243 // Only filter BError errors, Other results are not expected.
244 }
245 return true;
246 }
247
CmdInitBackupSessionFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)248 bool CmdInitBackupSessionFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
249 {
250 MessageParcel msg;
251 MessageParcel reply;
252
253 try {
254 msg.WriteBuffer(data, size);
255 service->CmdInitBackupSession(msg, reply);
256
257 BSessionBackup::Callbacks callbacks;
258 msg.WriteRemoteObject(new ServiceReverse(callbacks));
259 ExpectReturn({false});
260 service->CmdInitBackupSession(msg, reply);
261
262 msg.FlushBuffer();
263 msg.WriteRemoteObject(new ServiceReverse(callbacks));
264 ExpectReturn({true});
265 service->CmdInitBackupSession(msg, reply);
266 } catch (OHOS::FileManagement::Backup::BError &err) {
267 // Only filter BError errors, Other results are not expected.
268 }
269 return true;
270 }
271
CmdStartFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)272 bool CmdStartFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
273 {
274 MessageParcel msg;
275 MessageParcel reply;
276
277 try {
278 msg.WriteBuffer(data, size);
279 ExpectReturn({false});
280 service->CmdStart(msg, reply);
281
282 ExpectReturn({true});
283 service->CmdStart(msg, reply);
284 } catch (OHOS::FileManagement::Backup::BError &err) {
285 // Only filter BError errors, Other results are not expected.
286 }
287 return true;
288 }
289
CmdGetLocalCapabilitiesFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)290 bool CmdGetLocalCapabilitiesFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
291 {
292 MessageParcel msg;
293 MessageParcel reply;
294
295 try {
296 msg.WriteBuffer(data, size);
297 ExpectReturn({false});
298 service->CmdGetLocalCapabilities(msg, reply);
299
300 ExpectReturn({true});
301 service->CmdGetLocalCapabilities(msg, reply);
302 } catch (OHOS::FileManagement::Backup::BError &err) {
303 // Only filter BError errors, Other results are not expected.
304 }
305 return true;
306 }
307
CmdPublishFileFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)308 bool CmdPublishFileFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
309 {
310 if (data == nullptr || size < sizeof(TmpFileSN)) {
311 return true;
312 }
313
314 MessageParcel msg;
315 MessageParcel reply;
316
317 try {
318 int pos = 0;
319 BFileInfo info;
320 info.sn = TypeCast<TmpFileSN>(data, &pos);
321 int len = (size - pos) >> 1;
322 info.owner = string(reinterpret_cast<const char*>(data + pos), len);
323 info.fileName = string(reinterpret_cast<const char*>(data + pos + len), len);
324
325 msg.WriteParcelable(&info);
326 ExpectReturn({1, true, true, true, false});
327 ExpectArgReturn({info.owner, info.fileName, info.sn});
328 service->CmdPublishFile(msg, reply);
329
330 msg.FlushBuffer();
331 msg.WriteParcelable(&info);
332 ExpectReturn({1, true, true, true, true});
333 ExpectArgReturn({info.owner, info.fileName, info.sn});
334 service->CmdPublishFile(msg, reply);
335 } catch (OHOS::FileManagement::Backup::BError &err) {
336 // Only filter BError errors, Other results are not expected.
337 }
338 return true;
339 }
340
CmdAppFileReadyFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)341 bool CmdAppFileReadyFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
342 {
343 if (data == nullptr || size < sizeof(int32_t) + sizeof(bool) + sizeof(int)) {
344 return true;
345 }
346
347 MessageParcel msg;
348 MessageParcel reply;
349
350 try {
351 int pos = 0;
352 int fd = TypeCast<int>(data, &pos);
353 int32_t errCode = TypeCast<int32_t>(data + pos, &pos);
354 bool flag = TypeCast<bool>(data + pos, &pos);
355 string fileName(reinterpret_cast<const char*>(data + pos), size - pos);
356
357 service->CmdAppFileReady(msg, reply);
358
359 ExpectReturn({false});
360 ExpectArgReturn({fileName});
361 service->CmdAppFileReady(msg, reply);
362
363 msg.FlushBuffer();
364 flag == true ? ExpectReturn({true, flag, fd, errCode, false}) : ExpectReturn({true, flag, errCode, false});
365 ExpectArgReturn({fileName});
366 service->CmdAppFileReady(msg, reply);
367
368 msg.FlushBuffer();
369 flag == true ? ExpectReturn({true, flag, fd, errCode, true}) : ExpectReturn({true, flag, errCode, true});
370 ExpectArgReturn({fileName});
371 service->CmdAppFileReady(msg, reply);
372 } catch (OHOS::FileManagement::Backup::BError &err) {
373 // Only filter BError errors, Other results are not expected.
374 }
375 return true;
376 }
377
CmdAppDoneFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)378 bool CmdAppDoneFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
379 {
380 if (data == nullptr || size < sizeof(int32_t)) {
381 return true;
382 }
383
384 MessageParcel msg;
385 MessageParcel reply;
386
387 try {
388 int32_t errCode = TypeCast<int32_t>(data);
389
390 ExpectReturn({false});
391 ExpectArgReturn({errCode});
392 service->CmdAppDone(msg, reply);
393
394 ExpectReturn({true, false});
395 ExpectArgReturn({errCode});
396 service->CmdAppDone(msg, reply);
397
398 ExpectReturn({true, true});
399 ExpectArgReturn({errCode});
400 service->CmdAppDone(msg, reply);
401 } catch (OHOS::FileManagement::Backup::BError &err) {
402 // Only filter BError errors, Other results are not expected.
403 }
404 return true;
405 }
406
CmdResultReportFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)407 bool CmdResultReportFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
408 {
409 if (data == nullptr || size < sizeof(int32_t) + sizeof(int32_t)) {
410 return true;
411 }
412
413 MessageParcel msg;
414 MessageParcel reply;
415
416 try {
417 int pos = 0;
418 int32_t scenario = TypeCast<int32_t>(data, &pos);
419 int32_t errCode = TypeCast<int32_t>(data + pos, &pos);
420 string restoreRetInfo(reinterpret_cast<const char*>(data + pos), size - pos);
421
422 ExpectReturn({false});
423 ExpectArgReturn({restoreRetInfo});
424 service->CmdResultReport(msg, reply);
425
426 ExpectReturn({true, false});
427 ExpectArgReturn({restoreRetInfo, scenario});
428 service->CmdResultReport(msg, reply);
429
430 ExpectReturn({true, true, false});
431 ExpectArgReturn({restoreRetInfo, scenario, errCode});
432 service->CmdResultReport(msg, reply);
433
434 ExpectReturn({true, true, true, false});
435 ExpectArgReturn({restoreRetInfo, scenario, errCode});
436 service->CmdResultReport(msg, reply);
437
438 ExpectReturn({true, true, true, true});
439 ExpectArgReturn({restoreRetInfo, scenario, errCode});
440 service->CmdResultReport(msg, reply);
441 } catch (OHOS::FileManagement::Backup::BError &err) {
442 // Only filter BError errors, Other results are not expected.
443 }
444 return true;
445 }
446
CmdGetFileHandleFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)447 bool CmdGetFileHandleFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
448 {
449 MessageParcel msg;
450 MessageParcel reply;
451
452 try {
453 int len = size >> 1;
454 string bundleName(reinterpret_cast<const char*>(data), len);
455 string fileName(reinterpret_cast<const char*>(data + len), size - len);
456
457 ExpectReturn({false});
458 ExpectArgReturn({bundleName});
459 service->CmdGetFileHandle(msg, reply);
460
461 ExpectReturn({true, false});
462 ExpectArgReturn({bundleName, fileName});
463 service->CmdGetFileHandle(msg, reply);
464
465 ExpectReturn({true, true});
466 ExpectArgReturn({bundleName, fileName});
467 service->CmdGetFileHandle(msg, reply);
468 } catch (OHOS::FileManagement::Backup::BError &err) {
469 // Only filter BError errors, Other results are not expected.
470 }
471 return true;
472 }
473
CmdAppendBundlesRestoreSessionFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)474 bool CmdAppendBundlesRestoreSessionFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
475 {
476 if (data == nullptr || size < sizeof(int) + sizeof(int32_t) + sizeof(int32_t)) {
477 return true;
478 }
479
480 MessageParcel msg;
481 MessageParcel reply;
482
483 try {
484 int pos = 0;
485 int fd = TypeCast<int>(data, &pos);
486 int32_t type = TypeCast<int32_t>(data + pos, &pos);
487 int32_t userId = TypeCast<int32_t>(data + pos, &pos);
488 vector<string> bundleNames;
489 bundleNames.emplace_back(string(reinterpret_cast<const char*>(data + pos), size - pos));
490
491 ExpectReturn({fd, false});
492 ExpectArgReturn({bundleNames});
493 service->CmdAppendBundlesRestoreSession(msg, reply);
494
495 ExpectReturn({fd, true, false});
496 ExpectArgReturn({bundleNames, type});
497 service->CmdAppendBundlesRestoreSession(msg, reply);
498
499 ExpectReturn({fd, true, true, false});
500 ExpectArgReturn({bundleNames, type, userId});
501 service->CmdAppendBundlesRestoreSession(msg, reply);
502
503 ExpectReturn({fd, true, true, true, false});
504 ExpectArgReturn({bundleNames, type, userId});
505 service->CmdAppendBundlesRestoreSession(msg, reply);
506
507 ExpectReturn({fd, true, true, true, true});
508 ExpectArgReturn({bundleNames, type, userId});
509 service->CmdAppendBundlesRestoreSession(msg, reply);
510 } catch (OHOS::FileManagement::Backup::BError &err) {
511 // Only filter BError errors, Other results are not expected.
512 }
513 return true;
514 }
515
CmdAppendBundlesDetailsRestoreSessionFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)516 bool CmdAppendBundlesDetailsRestoreSessionFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
517 {
518 if (data == nullptr || size < sizeof(int) + sizeof(int32_t) + sizeof(int32_t)) {
519 return true;
520 }
521
522 MessageParcel msg;
523 MessageParcel reply;
524
525 try {
526 int pos = 0;
527 int fd = TypeCast<int>(data, &pos);
528 int32_t type = TypeCast<int32_t>(data + pos, &pos);
529 int32_t userId = TypeCast<int32_t>(data + pos, &pos);
530 int len = (size - pos) >> 1;
531 vector<string> bundleNames;
532 bundleNames.emplace_back(string(reinterpret_cast<const char*>(data + pos), len));
533 vector<string> detailInfos;
534 detailInfos.emplace_back(string(reinterpret_cast<const char*>(data + pos + len), len));
535
536 ExpectReturn({fd, false});
537 ExpectArgReturn({bundleNames});
538 service->CmdAppendBundlesDetailsRestoreSession(msg, reply);
539
540 ExpectReturn({fd, true, false});
541 ExpectArgReturn({bundleNames, detailInfos});
542 service->CmdAppendBundlesDetailsRestoreSession(msg, reply);
543
544 ExpectReturn({fd, true, true, false});
545 ExpectArgReturn({bundleNames, detailInfos, type});
546 service->CmdAppendBundlesDetailsRestoreSession(msg, reply);
547
548 ExpectReturn({fd, true, true, true, false});
549 ExpectArgReturn({bundleNames, detailInfos, type, userId});
550 service->CmdAppendBundlesDetailsRestoreSession(msg, reply);
551
552 ExpectReturn({fd, true, true, true, true, false});
553 ExpectArgReturn({bundleNames, detailInfos, type, userId});
554 service->CmdAppendBundlesDetailsRestoreSession(msg, reply);
555
556 ExpectReturn({fd, true, true, true, true, true});
557 ExpectArgReturn({bundleNames, detailInfos, type, userId});
558 service->CmdAppendBundlesDetailsRestoreSession(msg, reply);
559 } catch (OHOS::FileManagement::Backup::BError &err) {
560 // Only filter BError errors, Other results are not expected.
561 }
562 return true;
563 }
564
CmdAppendBundlesBackupSessionFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)565 bool CmdAppendBundlesBackupSessionFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
566 {
567 MessageParcel msg;
568 MessageParcel reply;
569
570 try {
571 vector<string> bundleNames;
572 bundleNames.emplace_back(string(reinterpret_cast<const char*>(data), size));
573
574 ExpectReturn({false});
575 ExpectArgReturn({bundleNames});
576 service->CmdAppendBundlesBackupSession(msg, reply);
577
578 ExpectReturn({true, false});
579 ExpectArgReturn({bundleNames});
580 service->CmdAppendBundlesBackupSession(msg, reply);
581
582 ExpectReturn({true, true});
583 ExpectArgReturn({bundleNames});
584 service->CmdAppendBundlesBackupSession(msg, reply);
585 } catch (OHOS::FileManagement::Backup::BError &err) {
586 // Only filter BError errors, Other results are not expected.
587 }
588 return true;
589 }
590
CmdAppendBundlesDetailsBackupSessionFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)591 bool CmdAppendBundlesDetailsBackupSessionFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
592 {
593 MessageParcel msg;
594 MessageParcel reply;
595
596 try {
597 int len = size >> 1;
598 vector<string> bundleNames;
599 bundleNames.emplace_back(string(reinterpret_cast<const char*>(data), len));
600 vector<string> detailInfos;
601 detailInfos.emplace_back(string(reinterpret_cast<const char*>(data + len), len));
602
603 ExpectReturn({false});
604 ExpectArgReturn({bundleNames});
605 service->CmdAppendBundlesDetailsBackupSession(msg, reply);
606
607 ExpectReturn({true, false});
608 ExpectArgReturn({bundleNames, detailInfos});
609 service->CmdAppendBundlesDetailsBackupSession(msg, reply);
610
611 ExpectReturn({true, true, false});
612 ExpectArgReturn({bundleNames, detailInfos});
613 service->CmdAppendBundlesDetailsBackupSession(msg, reply);
614
615 ExpectReturn({true, true, true});
616 ExpectArgReturn({bundleNames, detailInfos});
617 service->CmdAppendBundlesDetailsBackupSession(msg, reply);
618 } catch (OHOS::FileManagement::Backup::BError &err) {
619 // Only filter BError errors, Other results are not expected.
620 }
621 return true;
622 }
623
CmdFinishFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)624 bool CmdFinishFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
625 {
626 MessageParcel msg;
627 MessageParcel reply;
628 try {
629 msg.WriteBuffer(data, size);
630 ExpectReturn({false});
631 service->CmdFinish(msg, reply);
632
633 ExpectReturn({true});
634 service->CmdFinish(msg, reply);
635 } catch (OHOS::FileManagement::Backup::BError &err) {
636 // Only filter BError errors, Other results are not expected.
637 }
638 return true;
639 }
640
CmdReleaseFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)641 [[maybe_unused]] bool CmdReleaseFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
642 {
643 MessageParcel msg;
644 MessageParcel reply;
645 try {
646 msg.WriteBuffer(data, size);
647 service->CmdRelease(msg, reply);
648 } catch (OHOS::FileManagement::Backup::BError &err) {
649 // Only filter BError errors, Other results are not expected.
650 }
651 return true;
652 }
653
CmdGetLocalCapabilitiesIncrementalFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)654 bool CmdGetLocalCapabilitiesIncrementalFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
655 {
656 MessageParcel msg;
657 MessageParcel reply;
658
659 try {
660 BIncrementalData bundleNames(string(reinterpret_cast<const char*>(data), size), 0);
661
662 int32_t infoSize = 1;
663 ExpectReturn({false});
664 ExpectArgReturn({infoSize});
665 service->CmdGetLocalCapabilitiesIncremental(msg, reply);
666
667 ExpectReturn({true, true, true, true, true, true, 1, true, true, true, 0, true, false});
668 ExpectArgReturn({infoSize, "", "", 1});
669 msg.FlushBuffer();
670 msg.WriteParcelable(&bundleNames);
671 service->CmdGetLocalCapabilitiesIncremental(msg, reply);
672
673 ExpectReturn({true, true, true, true, true, true, 1, true, true, true, 0, true, true});
674 ExpectArgReturn({infoSize, "", "", 1});
675 msg.FlushBuffer();
676 msg.WriteParcelable(&bundleNames);
677 service->CmdGetLocalCapabilitiesIncremental(msg, reply);
678 } catch (OHOS::FileManagement::Backup::BError &err) {
679 // Only filter BError errors, Other results are not expected.
680 }
681 return true;
682 }
683
CmdGetAppLocalListAndDoIncrementalBackupFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)684 bool CmdGetAppLocalListAndDoIncrementalBackupFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
685 {
686 MessageParcel msg;
687 MessageParcel reply;
688 try {
689 msg.WriteBuffer(data, size);
690 ExpectReturn({false});
691 service->CmdGetAppLocalListAndDoIncrementalBackup(msg, reply);
692
693 ExpectReturn({true});
694 service->CmdGetAppLocalListAndDoIncrementalBackup(msg, reply);
695 } catch (OHOS::FileManagement::Backup::BError &err) {
696 // Only filter BError errors, Other results are not expected.
697 }
698 return true;
699 }
700
CmdInitIncrementalBackupSessionFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)701 bool CmdInitIncrementalBackupSessionFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
702 {
703 MessageParcel msg;
704 MessageParcel reply;
705
706 try {
707 msg.WriteBuffer(data, size);
708 service->CmdInitIncrementalBackupSession(msg, reply);
709
710 BIncrementalBackupSession::Callbacks callbacks;
711 msg.WriteRemoteObject(new ServiceReverse(callbacks));
712 ExpectReturn({false});
713 service->CmdInitIncrementalBackupSession(msg, reply);
714
715 msg.FlushBuffer();
716 msg.WriteRemoteObject(new ServiceReverse(callbacks));
717 ExpectReturn({true});
718 service->CmdInitIncrementalBackupSession(msg, reply);
719 } catch (OHOS::FileManagement::Backup::BError &err) {
720 // Only filter BError errors, Other results are not expected.
721 }
722 return true;
723 }
724
CmdAppendBundlesIncrementalBackupSessionFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)725 bool CmdAppendBundlesIncrementalBackupSessionFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
726 {
727 MessageParcel msg;
728 MessageParcel reply;
729
730 try {
731 BIncrementalData bundlesToBackup(string(reinterpret_cast<const char*>(data), size), 0);
732
733 ExpectReturn({false});
734 service->CmdAppendBundlesIncrementalBackupSession(msg, reply);
735
736 int32_t infoSize = 1;
737 ExpectReturn({true, true, true, true, true, true, 1, true, true, true, 0, false});
738 ExpectArgReturn({infoSize, "", "", 1});
739 msg.FlushBuffer();
740 msg.WriteParcelable(&bundlesToBackup);
741 service->CmdAppendBundlesIncrementalBackupSession(msg, reply);
742
743 ExpectReturn({true, true, true, true, true, true, 1, true, true, true, 0, true});
744 ExpectArgReturn({infoSize, "", "", 1});
745 msg.FlushBuffer();
746 msg.WriteParcelable(&bundlesToBackup);
747 service->CmdAppendBundlesIncrementalBackupSession(msg, reply);
748 } catch (OHOS::FileManagement::Backup::BError &err) {
749 // Only filter BError errors, Other results are not expected.
750 }
751 return true;
752 }
753
CmdAppendBundlesDetailsIncrementalBackupSessionFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)754 bool CmdAppendBundlesDetailsIncrementalBackupSessionFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
755 {
756 MessageParcel msg;
757 MessageParcel reply;
758
759 try {
760 int32_t infoSize = 1;
761 int len = size >> 1;
762 BIncrementalData bundlesToBackup(string(reinterpret_cast<const char*>(data), len), 0);
763 std::vector<std::string> infos;
764 infos.emplace_back(string(reinterpret_cast<const char*>(data + len), len));
765
766 ExpectReturn({false});
767 ExpectArgReturn({infoSize});
768 service->CmdAppendBundlesDetailsIncrementalBackupSession(msg, reply);
769
770 ExpectReturn({true, true, true, true, true, true, 1, true, true, true, 0, false});
771 ExpectArgReturn({infoSize, "", "", 1, infos});
772 msg.FlushBuffer();
773 msg.WriteParcelable(&bundlesToBackup);
774 service->CmdAppendBundlesDetailsIncrementalBackupSession(msg, reply);
775
776 ExpectReturn({true, true, true, true, true, true, 1, true, true, true, 0, true, false});
777 ExpectArgReturn({infoSize, "", "", 1, infos});
778 msg.FlushBuffer();
779 msg.WriteParcelable(&bundlesToBackup);
780 service->CmdAppendBundlesDetailsIncrementalBackupSession(msg, reply);
781
782 ExpectReturn({true, true, true, true, true, true, 1, true, true, true, 0, true, true});
783 ExpectArgReturn({infoSize, "", "", 1, infos});
784 msg.FlushBuffer();
785 msg.WriteParcelable(&bundlesToBackup);
786 service->CmdAppendBundlesDetailsIncrementalBackupSession(msg, reply);
787 } catch (OHOS::FileManagement::Backup::BError &err) {
788 // Only filter BError errors, Other results are not expected.
789 }
790 return true;
791 }
792
CmdPublishIncrementalFileFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)793 bool CmdPublishIncrementalFileFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
794 {
795 if (data == nullptr || size < sizeof(TmpFileSN)) {
796 return true;
797 }
798
799 MessageParcel msg;
800 MessageParcel reply;
801
802 try {
803 int pos = 0;
804 BFileInfo info;
805 info.sn = TypeCast<TmpFileSN>(data, &pos);
806 int len = (size - pos) >> 1;
807 info.owner = string(reinterpret_cast<const char*>(data + pos), len);
808 info.fileName = string(reinterpret_cast<const char*>(data + pos + len), len);
809
810 msg.WriteParcelable(&info);
811 ExpectReturn({1, true, true, true, false});
812 ExpectArgReturn({info.owner, info.fileName, info.sn});
813 service->CmdPublishIncrementalFile(msg, reply);
814
815 msg.FlushBuffer();
816 msg.WriteParcelable(&info);
817 ExpectReturn({1, true, true, true, true});
818 ExpectArgReturn({info.owner, info.fileName, info.sn});
819 service->CmdPublishIncrementalFile(msg, reply);
820 } catch (OHOS::FileManagement::Backup::BError &err) {
821 // Only filter BError errors, Other results are not expected.
822 }
823 return true;
824 }
825
CmdPublishSAIncrementalFileFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)826 [[maybe_unused]] bool CmdPublishSAIncrementalFileFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
827 {
828 if (data == nullptr || size < sizeof(int) + sizeof(TmpFileSN)) {
829 return true;
830 }
831
832 MessageParcel msg;
833 MessageParcel reply;
834
835 try {
836 int pos = 0;
837 BFileInfo info;
838 int fd = TypeCast<int>(data, &pos);
839 info.sn = TypeCast<TmpFileSN>(data, &pos);
840 int len = (size - pos) >> 1;
841 info.owner = string(reinterpret_cast<const char*>(data + pos), len);
842 info.fileName = string(reinterpret_cast<const char*>(data + pos + len), len);
843
844 msg.WriteParcelable(&info);
845 ExpectReturn({fd, false});
846 service->CmdPublishSAIncrementalFile(msg, reply);
847
848 msg.FlushBuffer();
849 msg.WriteParcelable(&info);
850 ExpectReturn({fd, true});
851 service->CmdPublishSAIncrementalFile(msg, reply);
852 } catch (OHOS::FileManagement::Backup::BError &err) {
853 // Only filter BError errors, Other results are not expected.
854 }
855 return true;
856 }
857
CmdAppIncrementalFileReadyFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)858 bool CmdAppIncrementalFileReadyFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
859 {
860 if (data == nullptr || size < sizeof(int32_t) + sizeof(bool) + sizeof(int) + sizeof(int)) {
861 return true;
862 }
863
864 MessageParcel msg;
865 MessageParcel reply;
866
867 try {
868 int pos = 0;
869 int fd1 = TypeCast<int>(data, &pos);
870 int fd2 = TypeCast<int>(data + pos, &pos);
871 int32_t errCode = TypeCast<int32_t>(data + pos, &pos);
872 bool flag = TypeCast<bool>(data + pos, &pos);
873 string fileName(reinterpret_cast<const char*>(data + pos), size - pos);
874
875 ExpectReturn({false});
876 ExpectArgReturn({fileName});
877 service->CmdAppIncrementalFileReady(msg, reply);
878
879 if (flag) {
880 fd1 < 0 ? ExpectReturn({true, flag, fd1, errCode, false}) :
881 ExpectReturn({true, flag, fd1, fd2, errCode, false});
882 } else {
883 ExpectReturn({true, flag, errCode, false});
884 }
885 ExpectArgReturn({fileName});
886 service->CmdAppIncrementalFileReady(msg, reply);
887
888 if (flag) {
889 fd1 < 0 ? ExpectReturn({true, flag, fd1, errCode, true}) :
890 ExpectReturn({true, flag, fd1, fd2, errCode, true});
891 } else {
892 ExpectReturn({true, flag, errCode, true});
893 }
894 ExpectArgReturn({fileName});
895 service->CmdAppIncrementalFileReady(msg, reply);
896 } catch (OHOS::FileManagement::Backup::BError &err) {
897 // Only filter BError errors, Other results are not expected.
898 }
899 return true;
900 }
901
CmdAppIncrementalDoneFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)902 bool CmdAppIncrementalDoneFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
903 {
904 if (data == nullptr || size < sizeof(int32_t)) {
905 return true;
906 }
907
908 MessageParcel msg;
909 MessageParcel reply;
910
911 try {
912 int32_t errCode = TypeCast<int32_t>(data);
913
914 ExpectReturn({false});
915 ExpectArgReturn({errCode});
916 service->CmdAppIncrementalDone(msg, reply);
917
918 ExpectReturn({true, false});
919 ExpectArgReturn({errCode});
920 service->CmdAppIncrementalDone(msg, reply);
921
922 ExpectReturn({true, true});
923 ExpectArgReturn({errCode});
924 service->CmdAppIncrementalDone(msg, reply);
925 } catch (OHOS::FileManagement::Backup::BError &err) {
926 // Only filter BError errors, Other results are not expected.
927 }
928 return true;
929 }
930
CmdGetIncrementalFileHandleFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)931 bool CmdGetIncrementalFileHandleFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
932 {
933 MessageParcel msg;
934 MessageParcel reply;
935
936 try {
937 int len = size >> 1;
938 string bundleName(reinterpret_cast<const char*>(data), len);
939 string fileName(reinterpret_cast<const char*>(data + len), size - len);
940
941 ExpectReturn({false});
942 ExpectArgReturn({bundleName});
943 service->CmdGetIncrementalFileHandle(msg, reply);
944
945 ExpectReturn({true, false});
946 ExpectArgReturn({bundleName, fileName});
947 service->CmdGetIncrementalFileHandle(msg, reply);
948
949 ExpectReturn({true, true});
950 ExpectArgReturn({bundleName, fileName});
951 service->CmdGetIncrementalFileHandle(msg, reply);
952 } catch (OHOS::FileManagement::Backup::BError &err) {
953 // Only filter BError errors, Other results are not expected.
954 }
955 return true;
956 }
957
CmdGetBackupInfoFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)958 bool CmdGetBackupInfoFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
959 {
960 if (data == nullptr || size < sizeof(int32_t)) {
961 return true;
962 }
963
964 MessageParcel msg;
965 MessageParcel reply;
966
967 try {
968 string bundleName(reinterpret_cast<const char*>(data), size);
969
970 ExpectReturn({false});
971 ExpectArgReturn({bundleName});
972 service->CmdGetBackupInfo(msg, reply);
973
974 ExpectReturn({true, false});
975 ExpectArgReturn({bundleName});
976 service->CmdGetBackupInfo(msg, reply);
977
978 ExpectReturn({true, true});
979 ExpectArgReturn({bundleName});
980 service->CmdGetBackupInfo(msg, reply);
981 } catch (OHOS::FileManagement::Backup::BError &err) {
982 // Only filter BError errors, Other results are not expected.
983 }
984 return true;
985 }
986
CmdUpdateTimerFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)987 bool CmdUpdateTimerFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
988 {
989 if (data == nullptr || size < sizeof(int32_t)) {
990 return true;
991 }
992
993 MessageParcel msg;
994 MessageParcel reply;
995
996 try {
997 int pos = 0;
998 uint32_t timeout = TypeCast<uint32_t>(data, &pos);
999 string bundleName(reinterpret_cast<const char*>(data + pos), size - pos);
1000
1001 ExpectReturn({false});
1002 ExpectArgReturn({bundleName});
1003 service->CmdUpdateTimer(msg, reply);
1004
1005 ExpectReturn({true, false});
1006 ExpectArgReturn({bundleName, timeout});
1007 service->CmdUpdateTimer(msg, reply);
1008
1009 ExpectReturn({true, true, false});
1010 ExpectArgReturn({bundleName, timeout});
1011 service->CmdUpdateTimer(msg, reply);
1012
1013 ExpectReturn({true, true, true});
1014 ExpectArgReturn({bundleName, timeout});
1015 service->CmdUpdateTimer(msg, reply);
1016 } catch (OHOS::FileManagement::Backup::BError &err) {
1017 // Only filter BError errors, Other results are not expected.
1018 }
1019 return true;
1020 }
1021
CmdUpdateSendRateFuzzTest(sptr<Service> service,const uint8_t * data,size_t size)1022 bool CmdUpdateSendRateFuzzTest(sptr<Service> service, const uint8_t *data, size_t size)
1023 {
1024 if (data == nullptr || size < sizeof(int32_t)) {
1025 return true;
1026 }
1027
1028 MessageParcel msg;
1029 MessageParcel reply;
1030
1031 try {
1032 int pos = 0;
1033 int32_t sendRate = TypeCast<int32_t>(data, &pos);
1034 string bundleName(reinterpret_cast<const char*>(data + pos), size - pos);
1035
1036 ExpectReturn({false});
1037 ExpectArgReturn({bundleName});
1038 service->CmdUpdateSendRate(msg, reply);
1039
1040 ExpectReturn({true, false});
1041 ExpectArgReturn({bundleName, sendRate});
1042 service->CmdUpdateSendRate(msg, reply);
1043
1044 ExpectReturn({true, true, false});
1045 ExpectArgReturn({bundleName, sendRate});
1046 service->CmdUpdateSendRate(msg, reply);
1047
1048 ExpectReturn({true, true, true});
1049 ExpectArgReturn({bundleName, sendRate});
1050 service->CmdUpdateSendRate(msg, reply);
1051 } catch (OHOS::FileManagement::Backup::BError &err) {
1052 // Only filter BError errors, Other results are not expected.
1053 }
1054 return true;
1055 }
1056 } // namespace OHOS
1057
1058 /* Fuzzer entry point */
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)1059 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
1060 {
1061 OHOS::sptr service(new OHOS::FileManagement::Backup::Service());
1062 if (service == nullptr) {
1063 return 0;
1064 }
1065
1066 try {
1067 OHOS::OnRemoteRequestFuzzTest(service, data, size);
1068 CmdInitRestoreSessionFuzzTest(service, data, size);
1069 CmdInitBackupSessionFuzzTest(service, data, size);
1070 CmdStartFuzzTest(service, data, size);
1071 CmdGetLocalCapabilitiesFuzzTest(service, data, size);
1072 CmdPublishFileFuzzTest(service, data, size);
1073 CmdAppFileReadyFuzzTest(service, data, size);
1074 CmdAppDoneFuzzTest(service, data, size);
1075 CmdResultReportFuzzTest(service, data, size);
1076 CmdGetFileHandleFuzzTest(service, data, size);
1077 CmdAppendBundlesRestoreSessionFuzzTest(service, data, size);
1078 CmdAppendBundlesDetailsRestoreSessionFuzzTest(service, data, size);
1079 CmdAppendBundlesBackupSessionFuzzTest(service, data, size);
1080 CmdAppendBundlesDetailsBackupSessionFuzzTest(service, data, size);
1081 CmdFinishFuzzTest(service, data, size);
1082 CmdGetLocalCapabilitiesIncrementalFuzzTest(service, data, size);
1083 CmdGetAppLocalListAndDoIncrementalBackupFuzzTest(service, data, size);
1084 CmdInitIncrementalBackupSessionFuzzTest(service, data, size);
1085 CmdAppendBundlesIncrementalBackupSessionFuzzTest(service, data, size);
1086 CmdAppendBundlesDetailsIncrementalBackupSessionFuzzTest(service, data, size);
1087 CmdPublishIncrementalFileFuzzTest(service, data, size);
1088 CmdAppIncrementalFileReadyFuzzTest(service, data, size);
1089 CmdAppIncrementalDoneFuzzTest(service, data, size);
1090 CmdGetIncrementalFileHandleFuzzTest(service, data, size);
1091 CmdGetBackupInfoFuzzTest(service, data, size);
1092 CmdUpdateTimerFuzzTest(service, data, size);
1093 CmdUpdateSendRateFuzzTest(service, data, size);
1094 } catch (OHOS::FileManagement::Backup::BError &err) {
1095 // Only filter BError errors, Other results are not expected.
1096 }
1097 return 0;
1098 }