diff --git a/test/fuzztest/BUILD.gn b/test/fuzztest/BUILD.gn index 1c4a33acaca84456e4ced6a5b2f1fded21826eaa..5b26911f68f9783c222c76aec8d343d10f3b099b 100644 --- a/test/fuzztest/BUILD.gn +++ b/test/fuzztest/BUILD.gn @@ -21,6 +21,7 @@ group("fuzztest") { "backupsaanother_fuzzer:BackupSaAnotherFuzzTest", "backupsaappend_fuzzer:BackupSaAppendFuzzTest", "backupservicestub_fuzzer:BackupServiceStubFuzzTest", + "backupservicestubbranch_fuzzer:BackupServiceStubBranchFuzzTest", "fileshare_fuzzer:FileShareFuzzTest", "remotefileshare_fuzzer:RemoteFileShareFuzzTest", "servicereverse_fuzzer:ServiceReverseFuzzTest", diff --git a/test/fuzztest/backupservicestubbranch_fuzzer/BUILD.gn b/test/fuzztest/backupservicestubbranch_fuzzer/BUILD.gn new file mode 100644 index 0000000000000000000000000000000000000000..72b6e4f444dd0649ad83dbc4a78605f745d30789 --- /dev/null +++ b/test/fuzztest/backupservicestubbranch_fuzzer/BUILD.gn @@ -0,0 +1,64 @@ +# Copyright (c) 2021-2023 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#####################hydra-fuzz################### +import("//build/config/features.gni") +import("//build/test.gni") +import("//foundation/filemanagement/app_file_service/app_file_service.gni") +import("//foundation/filemanagement/app_file_service/backup.gni") + +##############################fuzztest########################################## +ohos_fuzztest("BackupServiceStubBranchFuzzTest") { + module_out_path = "app_file_service/app_file_service" + fuzz_config_file = + "${app_file_service_path}/test/fuzztest/backupservicestubbranch_fuzzer" + include_dirs = [ + "${app_file_service_path}/frameworks/native/backup_kit_inner/include", + "${app_file_service_path}/interfaces/inner_api/native/backup_kit_inner/impl", + "${app_file_service_path}/services/backup_sa/include", + "${app_file_service_path}/services/backup_sa/include/module_ipc", + "${app_file_service_path}/utils/include", + "${app_file_service_path}/utils/include/b_hilog", + ] + cflags = [ + "-g", + "-O0", + "-Wno-unused-variable", + "-fno-omit-frame-pointer", + ] + sources = [ "backupservicestubbranch_fuzzer.cpp" ] + + deps = [ + "${app_file_service_path}/interfaces/inner_api/native/backup_kit_inner:backup_kit_inner", + "${app_file_service_path}/services/backup_sa:backup_sa", + "${app_file_service_path}/utils:backup_utils", + ] + + external_deps = [ + "ability_runtime:ability_manager", + "ability_runtime:abilitykit_native", + "c_utils:utils", + "hilog:libhilog", + "ipc:ipc_core", + "safwk:system_ability_fwk", + ] + + defines = [ + "LOG_TAG=\"app_file_service\"", + "LOG_DOMAIN=0xD004303", + "private=public", + ] + + use_exceptions = true +} +############################################################################### diff --git a/test/fuzztest/backupservicestubbranch_fuzzer/backupservicestubbranch_fuzzer.cpp b/test/fuzztest/backupservicestubbranch_fuzzer/backupservicestubbranch_fuzzer.cpp new file mode 100644 index 0000000000000000000000000000000000000000..4d2ba23426f3c59bd2f856b61fa6478a90a44e6d --- /dev/null +++ b/test/fuzztest/backupservicestubbranch_fuzzer/backupservicestubbranch_fuzzer.cpp @@ -0,0 +1,1092 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "backupservicestubbranch_fuzzer.h" + +#include +#include + +#include "b_incremental_data.h" +#include "b_session_backup.h" +#include "b_session_restore.h" +#include "message_parcel.h" +#include "refbase.h" +#include "service.h" +#include "service_reverse.h" + +namespace OHOS { +using namespace FileManagement::Backup; + +using FAFVariant = std::variant>; + +list que; +list arg; + +void ExpectReturn(list&& value) +{ + std::swap(que, value); +} + +void ExpectArgReturn(list&& value) +{ + std::swap(arg, value); +} + +bool GetBoolResult() +{ + bool ret = true; + if (!que.empty()) { + ret = std::get(que.front()); + que.pop_front(); + } + return ret; +} + +Parcelable::Parcelable() : Parcelable(false) +{} + +Parcelable::Parcelable(bool asRemote) +{ + asRemote_ = asRemote; + behavior_ = 0; +} + +template +bool Parcel::Write(T value) +{ + size_t desireCapacity = sizeof(T); + + if (EnsureWritableCapacity(desireCapacity)) { + *reinterpret_cast(data_ + writeCursor_) = value; + writeCursor_ += desireCapacity; + dataSize_ += desireCapacity; + return true; + } + + return false; +} + +bool Parcel::WriteParcelable(const Parcelable *object) +{ + if (object == nullptr) { + return WriteInt32(0); + } + + if (!object->asRemote_) { + bool flag = WriteInt32(1); + object->Marshalling(*this); + return flag; + } + + bool flag = WriteInt32(1); + WriteRemoteObject(const_cast(object)); + return flag; +} + +bool Parcel::WriteInt32(int32_t value) +{ + Write(value); + return GetBoolResult(); +} + +bool Parcel::WriteUint32(uint32_t value) +{ + Write(value); + return GetBoolResult(); +} + +int32_t Parcel::ReadInt32() +{ + int32_t ret = 0; + if (!que.empty()) { + ret = std::get(que.front()); + que.pop_front(); + } + return ret; +} + +bool Parcel::ReadInt32(int32_t &value) +{ + if (!arg.empty()) { + value = std::get(arg.front()); + arg.pop_front(); + } + return GetBoolResult(); +} + +bool Parcel::ReadBool() +{ + return GetBoolResult(); +} + +bool Parcel::ReadBool(bool &value) +{ + if (!arg.empty()) { + value = std::get(arg.front()); + arg.pop_front(); + } + return GetBoolResult(); +} + +bool Parcel::WriteBool(bool value) +{ + return GetBoolResult(); +} + +bool Parcel::WriteString(const std::string &value) +{ + return GetBoolResult(); +} + +bool Parcel::ReadString(std::string &value) +{ + if (!arg.empty()) { + value = std::get(arg.front()); + arg.pop_front(); + } + return GetBoolResult(); +} + +bool Parcel::ReadStringVector(std::vector *value) +{ + if (!arg.empty()) { + *value = std::get>(arg.front()); + arg.pop_front(); + } + return GetBoolResult(); +} + +bool MessageParcel::WriteFileDescriptor(int fd) +{ + return GetBoolResult(); +} + +int MessageParcel::ReadFileDescriptor() +{ + int32_t ret = 0; + if (!que.empty()) { + ret = std::get(que.front()); + que.pop_front(); + } + return ret; +} + +bool Parcel::ReadUint32(uint32_t &value) +{ + if (!arg.empty()) { + value = std::get(arg.front()); + arg.pop_front(); + } + return GetBoolResult(); +} + +constexpr int32_t SERVICE_ID = 5203; + +template +T TypeCast(const uint8_t *data, int *pos = nullptr) +{ + if (pos) { + *pos += sizeof(T); + } + return *(reinterpret_cast(data)); +} + +bool OnRemoteRequestFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + if (data == nullptr || size < sizeof(uint32_t)) { + return true; + } + + MessageParcel msg; + MessageParcel reply; + MessageOption option; + uint32_t code = TypeCast(data); + + service->OnRemoteRequest(code, msg, reply, option); + + msg.WriteInterfaceToken(ServiceStub::GetDescriptor()); + service->OnRemoteRequest(code, msg, reply, option); + return true; +} + +bool CmdInitRestoreSessionFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + MessageParcel msg; + MessageParcel reply; + + try { + service->CmdInitRestoreSession(msg, reply); + + BSessionRestore::Callbacks callbacks; + msg.WriteRemoteObject(new ServiceReverse(callbacks)); + ExpectReturn({false}); + service->CmdInitRestoreSession(msg, reply); + + msg.FlushBuffer(); + msg.WriteRemoteObject(new ServiceReverse(callbacks)); + ExpectReturn({true}); + service->CmdInitRestoreSession(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +bool CmdInitBackupSessionFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + MessageParcel msg; + MessageParcel reply; + + try { + service->CmdInitBackupSession(msg, reply); + + BSessionBackup::Callbacks callbacks; + msg.WriteRemoteObject(new ServiceReverse(callbacks)); + ExpectReturn({false}); + service->CmdInitBackupSession(msg, reply); + + msg.FlushBuffer(); + msg.WriteRemoteObject(new ServiceReverse(callbacks)); + ExpectReturn({true}); + service->CmdInitBackupSession(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +bool CmdStartFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + MessageParcel msg; + MessageParcel reply; + + try { + ExpectReturn({false}); + service->CmdStart(msg, reply); + + ExpectReturn({true}); + service->CmdStart(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +bool CmdGetLocalCapabilitiesFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + MessageParcel msg; + MessageParcel reply; + + try { + ExpectReturn({false}); + service->CmdGetLocalCapabilities(msg, reply); + + ExpectReturn({true}); + service->CmdGetLocalCapabilities(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +bool CmdPublishFileFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + if (data == nullptr || size < sizeof(TmpFileSN)) { + return true; + } + + MessageParcel msg; + MessageParcel reply; + + try { + int pos = 0; + BFileInfo info; + info.sn = TypeCast(data, &pos); + int len = (size - pos) >> 1; + info.owner = string(reinterpret_cast(data + pos), len); + info.fileName = string(reinterpret_cast(data + pos + len), len); + + msg.WriteParcelable(&info); + ExpectReturn({1, true, true, true, false}); + ExpectArgReturn({info.owner, info.fileName, info.sn}); + service->CmdPublishFile(msg, reply); + + msg.FlushBuffer(); + msg.WriteParcelable(&info); + ExpectReturn({1, true, true, true, true}); + ExpectArgReturn({info.owner, info.fileName, info.sn}); + service->CmdPublishFile(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +bool CmdAppFileReadyFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + if (data == nullptr || size < sizeof(int32_t) + sizeof(bool) + sizeof(int)) { + return true; + } + + MessageParcel msg; + MessageParcel reply; + + try { + int pos = 0; + int fd = TypeCast(data, &pos); + int32_t errCode = TypeCast(data + pos, &pos); + bool flag = TypeCast(data + pos, &pos); + string fileName(reinterpret_cast(data + pos), size - pos); + + service->CmdAppFileReady(msg, reply); + + ExpectReturn({false}); + ExpectArgReturn({fileName}); + service->CmdAppFileReady(msg, reply); + + msg.FlushBuffer(); + flag == true ? ExpectReturn({true, flag, fd, errCode, false}) : ExpectReturn({true, flag, errCode, false}); + ExpectArgReturn({fileName}); + service->CmdAppFileReady(msg, reply); + + msg.FlushBuffer(); + flag == true ? ExpectReturn({true, flag, fd, errCode, true}) : ExpectReturn({true, flag, errCode, true}); + ExpectArgReturn({fileName}); + service->CmdAppFileReady(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +bool CmdAppDoneFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + if (data == nullptr || size < sizeof(int32_t)) { + return true; + } + + MessageParcel msg; + MessageParcel reply; + + try { + int32_t errCode = TypeCast(data); + + ExpectReturn({false}); + ExpectArgReturn({errCode}); + service->CmdAppDone(msg, reply); + + ExpectReturn({true, false}); + ExpectArgReturn({errCode}); + service->CmdAppDone(msg, reply); + + ExpectReturn({true, true}); + ExpectArgReturn({errCode}); + service->CmdAppDone(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +bool CmdResultReportFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + if (data == nullptr || size < sizeof(int32_t) + sizeof(int32_t)) { + return true; + } + + MessageParcel msg; + MessageParcel reply; + + try { + int pos = 0; + int32_t scenario = TypeCast(data, &pos); + int32_t errCode = TypeCast(data + pos, &pos); + string restoreRetInfo(reinterpret_cast(data + pos), size - pos); + + ExpectReturn({false}); + ExpectArgReturn({restoreRetInfo}); + service->CmdResultReport(msg, reply); + + ExpectReturn({true, false}); + ExpectArgReturn({restoreRetInfo, scenario}); + service->CmdResultReport(msg, reply); + + ExpectReturn({true, true, false}); + ExpectArgReturn({restoreRetInfo, scenario, errCode}); + service->CmdResultReport(msg, reply); + + ExpectReturn({true, true, true, false}); + ExpectArgReturn({restoreRetInfo, scenario, errCode}); + service->CmdResultReport(msg, reply); + + ExpectReturn({true, true, true, true}); + ExpectArgReturn({restoreRetInfo, scenario, errCode}); + service->CmdResultReport(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +bool CmdGetFileHandleFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + MessageParcel msg; + MessageParcel reply; + + try { + int len = size >> 1; + string bundleName(reinterpret_cast(data), len); + string fileName(reinterpret_cast(data + len), size - len); + + ExpectReturn({false}); + ExpectArgReturn({bundleName}); + service->CmdGetFileHandle(msg, reply); + + ExpectReturn({true, false}); + ExpectArgReturn({bundleName, fileName}); + service->CmdGetFileHandle(msg, reply); + + ExpectReturn({true, true}); + ExpectArgReturn({bundleName, fileName}); + service->CmdGetFileHandle(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +bool CmdAppendBundlesRestoreSessionFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + if (data == nullptr || size < sizeof(int) + sizeof(int32_t) + sizeof(int32_t)) { + return true; + } + + MessageParcel msg; + MessageParcel reply; + + try { + int pos = 0; + int fd = TypeCast(data, &pos); + int32_t type = TypeCast(data + pos, &pos); + int32_t userId = TypeCast(data + pos, &pos); + vector bundleNames; + bundleNames.emplace_back(string(reinterpret_cast(data + pos), size - pos)); + + ExpectReturn({fd, false}); + ExpectArgReturn({bundleNames}); + service->CmdAppendBundlesRestoreSession(msg, reply); + + ExpectReturn({fd, true, false}); + ExpectArgReturn({bundleNames, type}); + service->CmdAppendBundlesRestoreSession(msg, reply); + + ExpectReturn({fd, true, true, false}); + ExpectArgReturn({bundleNames, type, userId}); + service->CmdAppendBundlesRestoreSession(msg, reply); + + ExpectReturn({fd, true, true, true, false}); + ExpectArgReturn({bundleNames, type, userId}); + service->CmdAppendBundlesRestoreSession(msg, reply); + + ExpectReturn({fd, true, true, true, true}); + ExpectArgReturn({bundleNames, type, userId}); + service->CmdAppendBundlesRestoreSession(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +bool CmdAppendBundlesDetailsRestoreSessionFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + if (data == nullptr || size < sizeof(int) + sizeof(int32_t) + sizeof(int32_t)) { + return true; + } + + MessageParcel msg; + MessageParcel reply; + + try { + int pos = 0; + int fd = TypeCast(data, &pos); + int32_t type = TypeCast(data + pos, &pos); + int32_t userId = TypeCast(data + pos, &pos); + int len = (size - pos) >> 1; + vector bundleNames; + bundleNames.emplace_back(string(reinterpret_cast(data + pos), len)); + vector detailInfos; + detailInfos.emplace_back(string(reinterpret_cast(data + pos + len), len)); + + ExpectReturn({fd, false}); + ExpectArgReturn({bundleNames}); + service->CmdAppendBundlesDetailsRestoreSession(msg, reply); + + ExpectReturn({fd, true, false}); + ExpectArgReturn({bundleNames, detailInfos}); + service->CmdAppendBundlesDetailsRestoreSession(msg, reply); + + ExpectReturn({fd, true, true, false}); + ExpectArgReturn({bundleNames, detailInfos, type}); + service->CmdAppendBundlesDetailsRestoreSession(msg, reply); + + ExpectReturn({fd, true, true, true, false}); + ExpectArgReturn({bundleNames, detailInfos, type, userId}); + service->CmdAppendBundlesDetailsRestoreSession(msg, reply); + + ExpectReturn({fd, true, true, true, true, false}); + ExpectArgReturn({bundleNames, detailInfos, type, userId}); + service->CmdAppendBundlesDetailsRestoreSession(msg, reply); + + ExpectReturn({fd, true, true, true, true, true}); + ExpectArgReturn({bundleNames, detailInfos, type, userId}); + service->CmdAppendBundlesDetailsRestoreSession(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +bool CmdAppendBundlesBackupSessionFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + MessageParcel msg; + MessageParcel reply; + + try { + vector bundleNames; + bundleNames.emplace_back(string(reinterpret_cast(data), size)); + + ExpectReturn({false}); + ExpectArgReturn({bundleNames}); + service->CmdAppendBundlesBackupSession(msg, reply); + + ExpectReturn({true, false}); + ExpectArgReturn({bundleNames}); + service->CmdAppendBundlesBackupSession(msg, reply); + + ExpectReturn({true, true}); + ExpectArgReturn({bundleNames}); + service->CmdAppendBundlesBackupSession(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +bool CmdAppendBundlesDetailsBackupSessionFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + MessageParcel msg; + MessageParcel reply; + + try { + int len = size >> 1; + vector bundleNames; + bundleNames.emplace_back(string(reinterpret_cast(data), len)); + vector detailInfos; + detailInfos.emplace_back(string(reinterpret_cast(data + len), len)); + + ExpectReturn({false}); + ExpectArgReturn({bundleNames}); + service->CmdAppendBundlesDetailsBackupSession(msg, reply); + + ExpectReturn({true, false}); + ExpectArgReturn({bundleNames, detailInfos}); + service->CmdAppendBundlesDetailsBackupSession(msg, reply); + + ExpectReturn({true, true, false}); + ExpectArgReturn({bundleNames, detailInfos}); + service->CmdAppendBundlesDetailsBackupSession(msg, reply); + + ExpectReturn({true, true, true}); + ExpectArgReturn({bundleNames, detailInfos}); + service->CmdAppendBundlesDetailsBackupSession(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +bool CmdFinishFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + MessageParcel msg; + MessageParcel reply; + try { + ExpectReturn({false}); + service->CmdFinish(msg, reply); + + ExpectReturn({true}); + service->CmdFinish(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +[[maybe_unused]] bool CmdReleaseFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + MessageParcel msg; + MessageParcel reply; + try { + service->CmdRelease(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +bool CmdGetLocalCapabilitiesIncrementalFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + MessageParcel msg; + MessageParcel reply; + + try { + BIncrementalData bundleNames(string(reinterpret_cast(data), size), 0); + + int32_t infoSize = 1; + ExpectReturn({false}); + ExpectArgReturn({infoSize}); + service->CmdGetLocalCapabilitiesIncremental(msg, reply); + + ExpectReturn({true, true, true, true, true, true, 1, true, true, true, 0, true, false}); + ExpectArgReturn({infoSize, "", "", 1}); + msg.FlushBuffer(); + msg.WriteParcelable(&bundleNames); + service->CmdGetLocalCapabilitiesIncremental(msg, reply); + + ExpectReturn({true, true, true, true, true, true, 1, true, true, true, 0, true, true}); + ExpectArgReturn({infoSize, "", "", 1}); + msg.FlushBuffer(); + msg.WriteParcelable(&bundleNames); + service->CmdGetLocalCapabilitiesIncremental(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +bool CmdGetAppLocalListAndDoIncrementalBackupFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + MessageParcel msg; + MessageParcel reply; + try { + ExpectReturn({false}); + service->CmdGetAppLocalListAndDoIncrementalBackup(msg, reply); + + ExpectReturn({true}); + service->CmdGetAppLocalListAndDoIncrementalBackup(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +bool CmdInitIncrementalBackupSessionFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + MessageParcel msg; + MessageParcel reply; + + try { + service->CmdInitIncrementalBackupSession(msg, reply); + + BIncrementalBackupSession::Callbacks callbacks; + msg.WriteRemoteObject(new ServiceReverse(callbacks)); + ExpectReturn({false}); + service->CmdInitIncrementalBackupSession(msg, reply); + + msg.FlushBuffer(); + msg.WriteRemoteObject(new ServiceReverse(callbacks)); + ExpectReturn({true}); + service->CmdInitIncrementalBackupSession(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +bool CmdAppendBundlesIncrementalBackupSessionFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + MessageParcel msg; + MessageParcel reply; + + try { + BIncrementalData bundlesToBackup(string(reinterpret_cast(data), size), 0); + + ExpectReturn({false}); + service->CmdAppendBundlesIncrementalBackupSession(msg, reply); + + int32_t infoSize = 1; + ExpectReturn({true, true, true, true, true, true, 1, true, true, true, 0, false}); + ExpectArgReturn({infoSize, "", "", 1}); + msg.FlushBuffer(); + msg.WriteParcelable(&bundlesToBackup); + service->CmdAppendBundlesIncrementalBackupSession(msg, reply); + + ExpectReturn({true, true, true, true, true, true, 1, true, true, true, 0, true}); + ExpectArgReturn({infoSize, "", "", 1}); + msg.FlushBuffer(); + msg.WriteParcelable(&bundlesToBackup); + service->CmdAppendBundlesIncrementalBackupSession(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +bool CmdAppendBundlesDetailsIncrementalBackupSessionFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + MessageParcel msg; + MessageParcel reply; + + try { + int32_t infoSize = 1; + int len = size >> 1; + BIncrementalData bundlesToBackup(string(reinterpret_cast(data), len), 0); + std::vector infos; + infos.emplace_back(string(reinterpret_cast(data + len), len)); + + ExpectReturn({false}); + ExpectArgReturn({infoSize}); + service->CmdAppendBundlesDetailsIncrementalBackupSession(msg, reply); + + ExpectReturn({true, true, true, true, true, true, 1, true, true, true, 0, false}); + ExpectArgReturn({infoSize, "", "", 1, infos}); + msg.FlushBuffer(); + msg.WriteParcelable(&bundlesToBackup); + service->CmdAppendBundlesDetailsIncrementalBackupSession(msg, reply); + + ExpectReturn({true, true, true, true, true, true, 1, true, true, true, 0, true, false}); + ExpectArgReturn({infoSize, "", "", 1, infos}); + msg.FlushBuffer(); + msg.WriteParcelable(&bundlesToBackup); + service->CmdAppendBundlesDetailsIncrementalBackupSession(msg, reply); + + ExpectReturn({true, true, true, true, true, true, 1, true, true, true, 0, true, true}); + ExpectArgReturn({infoSize, "", "", 1, infos}); + msg.FlushBuffer(); + msg.WriteParcelable(&bundlesToBackup); + service->CmdAppendBundlesDetailsIncrementalBackupSession(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +bool CmdPublishIncrementalFileFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + if (data == nullptr || size < sizeof(TmpFileSN)) { + return true; + } + + MessageParcel msg; + MessageParcel reply; + + try { + int pos = 0; + BFileInfo info; + info.sn = TypeCast(data, &pos); + int len = (size - pos) >> 1; + info.owner = string(reinterpret_cast(data + pos), len); + info.fileName = string(reinterpret_cast(data + pos + len), len); + + msg.WriteParcelable(&info); + ExpectReturn({1, true, true, true, false}); + ExpectArgReturn({info.owner, info.fileName, info.sn}); + service->CmdPublishIncrementalFile(msg, reply); + + msg.FlushBuffer(); + msg.WriteParcelable(&info); + ExpectReturn({1, true, true, true, true}); + ExpectArgReturn({info.owner, info.fileName, info.sn}); + service->CmdPublishIncrementalFile(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +[[maybe_unused]] bool CmdPublishSAIncrementalFileFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + if (data == nullptr || size < sizeof(int) + sizeof(TmpFileSN)) { + return true; + } + + MessageParcel msg; + MessageParcel reply; + + try { + int pos = 0; + BFileInfo info; + int fd = TypeCast(data, &pos); + info.sn = TypeCast(data, &pos); + int len = (size - pos) >> 1; + info.owner = string(reinterpret_cast(data + pos), len); + info.fileName = string(reinterpret_cast(data + pos + len), len); + + msg.WriteParcelable(&info); + ExpectReturn({fd, false}); + service->CmdPublishSAIncrementalFile(msg, reply); + + msg.FlushBuffer(); + msg.WriteParcelable(&info); + ExpectReturn({fd, true}); + service->CmdPublishSAIncrementalFile(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +bool CmdAppIncrementalFileReadyFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + if (data == nullptr || size < sizeof(int32_t) + sizeof(bool) + sizeof(int) + sizeof(int)) { + return true; + } + + MessageParcel msg; + MessageParcel reply; + + try { + int pos = 0; + int fd1 = TypeCast(data, &pos); + int fd2 = TypeCast(data + pos, &pos); + int32_t errCode = TypeCast(data + pos, &pos); + bool flag = TypeCast(data + pos, &pos); + string fileName(reinterpret_cast(data + pos), size - pos); + + ExpectReturn({false}); + ExpectArgReturn({fileName}); + service->CmdAppIncrementalFileReady(msg, reply); + + if (flag) { + fd1 < 0 ? ExpectReturn({true, flag, fd1, errCode, false}) : + ExpectReturn({true, flag, fd1, fd2, errCode, false}); + } else { + ExpectReturn({true, flag, errCode, false}); + } + ExpectArgReturn({fileName}); + service->CmdAppIncrementalFileReady(msg, reply); + + if (flag) { + fd1 < 0 ? ExpectReturn({true, flag, fd1, errCode, true}) : + ExpectReturn({true, flag, fd1, fd2, errCode, true}); + } else { + ExpectReturn({true, flag, errCode, true}); + } + ExpectArgReturn({fileName}); + service->CmdAppIncrementalFileReady(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +bool CmdAppIncrementalDoneFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + if (data == nullptr || size < sizeof(int32_t)) { + return true; + } + + MessageParcel msg; + MessageParcel reply; + + try { + int32_t errCode = TypeCast(data); + + ExpectReturn({false}); + ExpectArgReturn({errCode}); + service->CmdAppIncrementalDone(msg, reply); + + ExpectReturn({true, false}); + ExpectArgReturn({errCode}); + service->CmdAppIncrementalDone(msg, reply); + + ExpectReturn({true, true}); + ExpectArgReturn({errCode}); + service->CmdAppIncrementalDone(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +bool CmdGetIncrementalFileHandleFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + MessageParcel msg; + MessageParcel reply; + + try { + int len = size >> 1; + string bundleName(reinterpret_cast(data), len); + string fileName(reinterpret_cast(data + len), size - len); + + ExpectReturn({false}); + ExpectArgReturn({bundleName}); + service->CmdGetIncrementalFileHandle(msg, reply); + + ExpectReturn({true, false}); + ExpectArgReturn({bundleName, fileName}); + service->CmdGetIncrementalFileHandle(msg, reply); + + ExpectReturn({true, true}); + ExpectArgReturn({bundleName, fileName}); + service->CmdGetIncrementalFileHandle(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +bool CmdGetBackupInfoFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + if (data == nullptr || size < sizeof(int32_t)) { + return true; + } + + MessageParcel msg; + MessageParcel reply; + + try { + int pos = 0; + int32_t scenario = TypeCast(data, &pos); + string processInfo(reinterpret_cast(data + pos), size - pos); + + ExpectReturn({false}); + ExpectArgReturn({processInfo}); + service->CmdGetBackupInfo(msg, reply); + + ExpectReturn({true, false}); + ExpectArgReturn({processInfo, scenario}); + service->CmdGetBackupInfo(msg, reply); + + ExpectReturn({true, true}); + ExpectArgReturn({processInfo, scenario}); + service->CmdGetBackupInfo(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +bool CmdUpdateTimerFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + if (data == nullptr || size < sizeof(int32_t)) { + return true; + } + + MessageParcel msg; + MessageParcel reply; + + try { + int pos = 0; + uint32_t timeout = TypeCast(data, &pos); + string bundleName(reinterpret_cast(data + pos), size - pos); + + ExpectReturn({false}); + ExpectArgReturn({bundleName}); + service->CmdUpdateTimer(msg, reply); + + ExpectReturn({true, false}); + ExpectArgReturn({bundleName, timeout}); + service->CmdUpdateTimer(msg, reply); + + ExpectReturn({true, true, false}); + ExpectArgReturn({bundleName, timeout}); + service->CmdUpdateTimer(msg, reply); + + ExpectReturn({true, true, true}); + ExpectArgReturn({bundleName, timeout}); + service->CmdUpdateTimer(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} + +bool CmdUpdateSendRateFuzzTest(sptr service, const uint8_t *data, size_t size) +{ + if (data == nullptr || size < sizeof(int32_t)) { + return true; + } + + MessageParcel msg; + MessageParcel reply; + + try { + int pos = 0; + int32_t sendRate = TypeCast(data, &pos); + string bundleName(reinterpret_cast(data + pos), size - pos); + + ExpectReturn({false}); + ExpectArgReturn({bundleName}); + service->CmdUpdateSendRate(msg, reply); + + ExpectReturn({true, false}); + ExpectArgReturn({bundleName, sendRate}); + service->CmdUpdateSendRate(msg, reply); + + ExpectReturn({true, true, false}); + ExpectArgReturn({bundleName, sendRate}); + service->CmdUpdateSendRate(msg, reply); + + ExpectReturn({true, true, true}); + ExpectArgReturn({bundleName, sendRate}); + service->CmdUpdateSendRate(msg, reply); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return true; +} +} // namespace OHOS + +/* Fuzzer entry point */ +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) +{ + OHOS::sptr service(new OHOS::FileManagement::Backup::Service(OHOS::SERVICE_ID)); + if (service == nullptr) { + return 0; + } + + try { + OHOS::OnRemoteRequestFuzzTest(service, data, size); + CmdInitRestoreSessionFuzzTest(service, data, size); + CmdInitBackupSessionFuzzTest(service, data, size); + CmdStartFuzzTest(service, data, size); + CmdGetLocalCapabilitiesFuzzTest(service, data, size); + CmdPublishFileFuzzTest(service, data, size); + CmdAppFileReadyFuzzTest(service, data, size); + CmdAppDoneFuzzTest(service, data, size); + CmdResultReportFuzzTest(service, data, size); + CmdGetFileHandleFuzzTest(service, data, size); + CmdAppendBundlesRestoreSessionFuzzTest(service, data, size); + CmdAppendBundlesDetailsRestoreSessionFuzzTest(service, data, size); + CmdAppendBundlesBackupSessionFuzzTest(service, data, size); + CmdAppendBundlesDetailsBackupSessionFuzzTest(service, data, size); + CmdFinishFuzzTest(service, data, size); + CmdGetLocalCapabilitiesIncrementalFuzzTest(service, data, size); + CmdGetAppLocalListAndDoIncrementalBackupFuzzTest(service, data, size); + CmdInitIncrementalBackupSessionFuzzTest(service, data, size); + CmdAppendBundlesIncrementalBackupSessionFuzzTest(service, data, size); + CmdAppendBundlesDetailsIncrementalBackupSessionFuzzTest(service, data, size); + CmdPublishIncrementalFileFuzzTest(service, data, size); + CmdAppIncrementalFileReadyFuzzTest(service, data, size); + CmdAppIncrementalDoneFuzzTest(service, data, size); + CmdGetIncrementalFileHandleFuzzTest(service, data, size); + CmdGetBackupInfoFuzzTest(service, data, size); + CmdUpdateTimerFuzzTest(service, data, size); + CmdUpdateSendRateFuzzTest(service, data, size); + } catch (OHOS::FileManagement::Backup::BError &err) { + // Only filter BError errors, Other results are not expected. + } + return 0; +} \ No newline at end of file diff --git a/test/fuzztest/backupservicestubbranch_fuzzer/backupservicestubbranch_fuzzer.h b/test/fuzztest/backupservicestubbranch_fuzzer/backupservicestubbranch_fuzzer.h new file mode 100644 index 0000000000000000000000000000000000000000..e1a5fcc77b001f68fef2c5fedf2ed6c11656672c --- /dev/null +++ b/test/fuzztest/backupservicestubbranch_fuzzer/backupservicestubbranch_fuzzer.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef BACKUP_SERVICE_STUB_FUZZER_H +#define BACKUP_SERVICE_STUB_FUZZER_H + +#define FUZZ_PROJECT_NAME "backupservicestubbranch_fuzzer" + +#endif \ No newline at end of file diff --git a/test/fuzztest/backupservicestubbranch_fuzzer/corpus/init b/test/fuzztest/backupservicestubbranch_fuzzer/corpus/init new file mode 100644 index 0000000000000000000000000000000000000000..6198079a28e860189d4294f6598f8ac6804c0dff --- /dev/null +++ b/test/fuzztest/backupservicestubbranch_fuzzer/corpus/init @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +FUZZ \ No newline at end of file diff --git a/test/fuzztest/backupservicestubbranch_fuzzer/project.xml b/test/fuzztest/backupservicestubbranch_fuzzer/project.xml new file mode 100644 index 0000000000000000000000000000000000000000..7133b2b92440904a5ed04b838733acea0f97486a --- /dev/null +++ b/test/fuzztest/backupservicestubbranch_fuzzer/project.xml @@ -0,0 +1,25 @@ + + + + + + 1000 + + 300 + + 4096 + +