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