From 56f546b8571595ffb9d9238486f006322e399860 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=95=E6=8C=AF=E6=9D=B0?= Date: Thu, 10 Jul 2025 20:04:41 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=BA=94=E7=94=A8=E6=81=A2=E5=A4=8D?= =?UTF-8?q?=E8=87=AA=E6=9D=80=E5=9C=BA=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 吕振杰 --- .../include/module_ipc/svc_session_manager.h | 5 ++ services/backup_sa/src/module_ipc/service.cpp | 4 + .../backup_sa/src/module_ipc/sub_service.cpp | 4 +- .../src/module_ipc/svc_session_manager.cpp | 31 ++++++++ .../include/svc_session_manager_mock.h | 4 + .../src/svc_session_manager_mock.cpp | 9 +++ .../module_ipc/svc_session_manager_mock.cpp | 9 +++ .../svc_session_manager_throw_mock.cpp | 9 +++ .../svc_session_manager_throw_mock.h | 4 + .../backup_sa/module_ipc/service_test.cpp | 8 ++ .../svc_session_manager_ex_test.cpp | 76 +++++++++++++++++++ 11 files changed, 162 insertions(+), 1 deletion(-) diff --git a/services/backup_sa/include/module_ipc/svc_session_manager.h b/services/backup_sa/include/module_ipc/svc_session_manager.h index 5b3bbbbed..d9a40dd69 100644 --- a/services/backup_sa/include/module_ipc/svc_session_manager.h +++ b/services/backup_sa/include/module_ipc/svc_session_manager.h @@ -74,6 +74,7 @@ struct BackupExtInfo { bool isClearData {true}; bool isInPublishFile {false}; bool isReadyLaunch {false}; + bool isRestoreEnd {false}; }; class Service; @@ -579,6 +580,10 @@ public: void HandleOnRelease(sptr proxy); + void SetIsRestoreEnd(const std::string &bundleName); + + bool GetIsRestoreEnd(const std::string &bundleName); + private: /** * @brief 获取backup extension ability diff --git a/services/backup_sa/src/module_ipc/service.cpp b/services/backup_sa/src/module_ipc/service.cpp index a1bbe1bce..bb16e729b 100644 --- a/services/backup_sa/src/module_ipc/service.cpp +++ b/services/backup_sa/src/module_ipc/service.cpp @@ -985,6 +985,10 @@ ErrCode Service::ServiceResultReport(const std::string& restoreRetInfo, BackupRe CallOnBundleEndByScenario(callerName, sennario, ret); return ret; } + if (errCode == ERR_OK && (sennario == BackupRestoreScenario::INCREMENTAL_RESTORE || + sennario == BackupRestoreScenario::FULL_RESTORE)) { + session_->SetIsRestoreEnd(callerName); + } SendEndAppGalleryNotify(callerName); if (sennario == BackupRestoreScenario::FULL_RESTORE) { UpdateHandleCnt(errCode); diff --git a/services/backup_sa/src/module_ipc/sub_service.cpp b/services/backup_sa/src/module_ipc/sub_service.cpp index ad86f20e8..7c83fd08f 100644 --- a/services/backup_sa/src/module_ipc/sub_service.cpp +++ b/services/backup_sa/src/module_ipc/sub_service.cpp @@ -687,7 +687,9 @@ void Service::ExtConnectDied(const string &callName) ClearSessionAndSchedInfo(callName); } /* Notice Client Ext Ability Process Died */ - NoticeClientFinish(callName, BError(BError::Codes::EXT_ABILITY_DIED)); + if (!session_->GetIsRestoreEnd(callName)) { + NoticeClientFinish(callName, BError(BError::Codes::EXT_ABILITY_DIED)); + } } catch (...) { HILOGE("Unexpected exception, bundleName: %{public}s", callName.c_str()); SendEndAppGalleryNotify(callName); diff --git a/services/backup_sa/src/module_ipc/svc_session_manager.cpp b/services/backup_sa/src/module_ipc/svc_session_manager.cpp index 4dccce6be..07545697b 100644 --- a/services/backup_sa/src/module_ipc/svc_session_manager.cpp +++ b/services/backup_sa/src/module_ipc/svc_session_manager.cpp @@ -1332,4 +1332,35 @@ void SvcSessionManager::HandleOnRelease(sptr proxy) HILOGI("HandleOnRelease begin"); proxy->HandleOnRelease(static_cast(impl_.scenario)); } + +void SvcSessionManager::SetIsRestoreEnd(const std::string &bundleName) +{ + unique_lock lock(lock_); + if (!impl_.clientToken) { + HILOGE("No caller token was specified, bundleName:%{public}s", bundleName.c_str()); + return; + } + auto [findBundleSuc, it] = GetBackupExtNameMap(bundleName); + if (!findBundleSuc) { + HILOGE("BackupExtNameMap can not find bundle %{public}s", bundleName.c_str()); + return; + } + it->second.isRestoreEnd = true; + HILOGI("SetIsRestoreEnd success, bundleName = %{public}s", bundleName.c_str()); +} + +bool SvcSessionManager::GetIsRestoreEnd(const std::string &bundleName) +{ + shared_lock lock(lock_); + if (!impl_.clientToken) { + HILOGE("No caller token was specified, bundleName:%{public}s", bundleName.c_str()); + return false; + } + auto [findBundleSuc, it] = GetBackupExtNameMap(bundleName); + if (!findBundleSuc) { + HILOGE("BackupExtNameMap can not find bundle %{public}s", bundleName.c_str()); + return false; + } + return it->second.isRestoreEnd; +} } // namespace OHOS::FileManagement::Backup diff --git a/tests/mock/module_ipc/include/svc_session_manager_mock.h b/tests/mock/module_ipc/include/svc_session_manager_mock.h index d5e982a60..4c4a3a19b 100644 --- a/tests/mock/module_ipc/include/svc_session_manager_mock.h +++ b/tests/mock/module_ipc/include/svc_session_manager_mock.h @@ -64,6 +64,8 @@ public: virtual std::string GetOldBackupVersion() = 0; virtual void UpdateDfxInfo(const BundleName &bundleName, uint64_t uniqId) = 0; virtual void HandleOnRelease(sptr proxy) = 0; + virtual void SetIsRestoreEnd(const std::string &bundleName) = 0; + virtual bool GetIsRestoreEnd(const std::string &bundleName) = 0; public: BSvcSessionManager() = default; virtual ~BSvcSessionManager() = default; @@ -114,6 +116,8 @@ public: MOCK_METHOD(std::string, GetOldBackupVersion, ()); MOCK_METHOD(void, UpdateDfxInfo, (const std::string &, uint64_t)); MOCK_METHOD(void, HandleOnRelease, (sptr)); + MOCK_METHOD(void, SetIsRestoreEnd, (const std::string &)); + MOCK_METHOD(bool, GetIsRestoreEnd, (const std::string &)); }; } // namespace OHOS::FileManagement::Backup #endif // OHOS_FILEMGMT_BACKUP_SVC_SESSION_MANAGER_MOCK_H diff --git a/tests/mock/module_ipc/src/svc_session_manager_mock.cpp b/tests/mock/module_ipc/src/svc_session_manager_mock.cpp index 05413708f..ab02cc68d 100644 --- a/tests/mock/module_ipc/src/svc_session_manager_mock.cpp +++ b/tests/mock/module_ipc/src/svc_session_manager_mock.cpp @@ -310,4 +310,13 @@ std::string SvcSessionManager::GetOldBackupVersion() void SvcSessionManager::HandleOnRelease(sptr proxy) { } + +void SvcSessionManager::SetIsRestoreEnd(const std::string &bundleName) +{ +} + +bool SvcSessionManager::GetIsRestoreEnd(const std::string &bundleName) +{ + return false; +} } // namespace OHOS::FileManagement::Backup diff --git a/tests/mock/module_ipc/svc_session_manager_mock.cpp b/tests/mock/module_ipc/svc_session_manager_mock.cpp index 26060dfcc..c1862dc6c 100644 --- a/tests/mock/module_ipc/svc_session_manager_mock.cpp +++ b/tests/mock/module_ipc/svc_session_manager_mock.cpp @@ -534,4 +534,13 @@ void SvcSessionManager::UpdateDfxInfo(const std::string &bundleName, uint64_t un void SvcSessionManager::HandleOnRelease(sptr proxy) { } + +void SvcSessionManager::SetIsRestoreEnd(const std::string &bundleName) +{ +} + +bool SvcSessionManager::GetIsRestoreEnd(const std::string &bundleName) +{ + return false; +} } // namespace OHOS::FileManagement::Backup diff --git a/tests/mock/module_ipc/svc_session_manager_throw_mock.cpp b/tests/mock/module_ipc/svc_session_manager_throw_mock.cpp index 2fb2f741e..e144e43d4 100644 --- a/tests/mock/module_ipc/svc_session_manager_throw_mock.cpp +++ b/tests/mock/module_ipc/svc_session_manager_throw_mock.cpp @@ -364,4 +364,13 @@ std::string SvcSessionManager::GetOldBackupVersion() } void SvcSessionManager::HandleOnRelease(sptr proxy) {} + +void SvcSessionManager::SetIsRestoreEnd(const std::string &bundleName) +{ +} + +bool SvcSessionManager::GetIsRestoreEnd(const std::string &bundleName) +{ + return false; +} } // namespace OHOS::FileManagement::Backup diff --git a/tests/mock/module_ipc/svc_session_manager_throw_mock.h b/tests/mock/module_ipc/svc_session_manager_throw_mock.h index 65fd948bd..f183a662a 100644 --- a/tests/mock/module_ipc/svc_session_manager_throw_mock.h +++ b/tests/mock/module_ipc/svc_session_manager_throw_mock.h @@ -100,6 +100,8 @@ public: virtual std::string GetOldBackupVersion() = 0; virtual void UpdateDfxInfo(const BundleName &bundleName, uint64_t uniqId) = 0; virtual void HandleOnRelease(sptr proxy) = 0; + virtual void SetIsRestoreEnd(const std::string &bundleName) = 0; + virtual bool GetIsRestoreEnd(const std::string &bundleName) = 0; public: static inline std::shared_ptr session = nullptr; }; @@ -179,6 +181,8 @@ public: MOCK_METHOD(std::string, GetOldBackupVersion, ()); MOCK_METHOD(void, UpdateDfxInfo, (const std::string &, uint64_t)); MOCK_METHOD(void, HandleOnRelease, (sptr)); + MOCK_METHOD(void, SetIsRestoreEnd, (const std::string &)); + MOCK_METHOD(bool, GetIsRestoreEnd, (const std::string &)); }; } // namespace OHOS::FileManagement::Backup diff --git a/tests/unittests/backup_sa/module_ipc/service_test.cpp b/tests/unittests/backup_sa/module_ipc/service_test.cpp index 710c128c6..d47502656 100644 --- a/tests/unittests/backup_sa/module_ipc/service_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/service_test.cpp @@ -575,6 +575,12 @@ HWTEST_F(ServiceTest, SUB_Service_ServiceResultReport_0000, testing::ext::TestSi ret = servicePtr_->ServiceResultReport("test", static_cast(1000), 0); EXPECT_EQ(ret, BError(BError::Codes::OK)); + + ret = servicePtr_->ServiceResultReport("test", BackupRestoreScenario::INCREMENTAL_BACKUP, 1); + EXPECT_EQ(ret, BError(BError::Codes::OK)); + + ret = servicePtr_->ServiceResultReport("test", BackupRestoreScenario::FULL_RESTORE, 1); + EXPECT_EQ(ret, BError(BError::Codes::OK)); } catch (...) { EXPECT_TRUE(false); GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by ServiceResultReport."; @@ -2053,6 +2059,8 @@ HWTEST_F(ServiceTest, SUB_Service_ExtConnectDied_0100, testing::ext::TestSize.Le servicePtr_->ExtConnectDied(callName); extInfo.backUpConnection->isConnected_.store(true); servicePtr_->ExtConnectDied(callName); + extInfo.isRestoreEnd = true; + servicePtr_->ExtConnectDied(callName); } catch (...) { EXPECT_TRUE(false); GTEST_LOG_(INFO) << "ServiceTest-an exception occurred by ExtConnectDied."; diff --git a/tests/unittests/backup_sa/module_ipc/svc_session_manager_ex_test.cpp b/tests/unittests/backup_sa/module_ipc/svc_session_manager_ex_test.cpp index 5392951f5..1206bf28d 100644 --- a/tests/unittests/backup_sa/module_ipc/svc_session_manager_ex_test.cpp +++ b/tests/unittests/backup_sa/module_ipc/svc_session_manager_ex_test.cpp @@ -326,4 +326,80 @@ HWTEST_F(SvcSessionManagerTest, SUB_backup_sa_session_HandleOnRelease_0100, test GTEST_LOG_(INFO) << "SvcSessionManagerTest-an exception occurred by HandleOnRelease."; } GTEST_LOG_(INFO) << "SvcSessionManagerTest-end SUB_backup_sa_session_HandleOnRelease_0100"; +} + +/** + * @tc.number: SUB_backup_sa_session_SetIsRestoreEnd_0100 + * @tc.name: SUB_backup_sa_session_SetIsRestoreEnd_0100 + * @tc.desc: 测试 SetIsRestoreEnd + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(SvcSessionManagerTest, SUB_backup_sa_session_SetIsRestoreEnd_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "SvcSessionManagerTest-begin SUB_backup_sa_session_SetIsRestoreEnd_0100"; + try { + std::string bundleName = "com.test.bundleName"; + sessionManagerPtr_->impl_.clientToken = 0; + sessionManagerPtr_->impl_.backupExtNameMap.clear(); + sessionManagerPtr_->SetIsRestoreEnd(bundleName); + EXPECT_EQ(sessionManagerPtr_->impl_.backupExtNameMap.find(bundleName), + sessionManagerPtr_->impl_.backupExtNameMap.end()); + + sessionManagerPtr_->impl_.clientToken = CLIENT_TOKEN_ID; + sessionManagerPtr_->SetIsRestoreEnd(bundleName); + EXPECT_EQ(sessionManagerPtr_->impl_.backupExtNameMap.find(bundleName), + sessionManagerPtr_->impl_.backupExtNameMap.end()); + + BackupExtInfo backupInfo {}; + sessionManagerPtr_->impl_.backupExtNameMap[bundleName] = backupInfo; + EXPECT_NE(sessionManagerPtr_->impl_.backupExtNameMap.find(bundleName), + sessionManagerPtr_->impl_.backupExtNameMap.end()); + sessionManagerPtr_->SetIsRestoreEnd(bundleName); + bool ret = sessionManagerPtr_->impl_.backupExtNameMap[bundleName].isRestoreEnd; + EXPECT_TRUE(ret); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "SvcSessionManagerTest-an exception occurred by SetIsRestoreEnd."; + } + GTEST_LOG_(INFO) << "SvcSessionManagerTest-end SUB_backup_sa_session_SetIsRestoreEnd_0100"; +} + +/** + * @tc.number: SUB_backup_sa_session_GetIsRestoreEnd_0100 + * @tc.name: SUB_backup_sa_session_GetIsRestoreEnd_0100 + * @tc.desc: 测试 GetIsRestoreEnd + * @tc.size: MEDIUM + * @tc.type: FUNC + * @tc.level Level 1 + * @tc.require: I6F3GV + */ +HWTEST_F(SvcSessionManagerTest, SUB_backup_sa_session_GetIsRestoreEnd_0100, testing::ext::TestSize.Level1) +{ + GTEST_LOG_(INFO) << "SvcSessionManagerTest-begin SUB_backup_sa_session_GetIsRestoreEnd_0100"; + try { + std::string bundleName = "com.test.bundleName"; + sessionManagerPtr_->impl_.clientToken = 0; + sessionManagerPtr_->impl_.backupExtNameMap.clear(); + auto ret = sessionManagerPtr_->GetIsRestoreEnd(bundleName); + EXPECT_FALSE(ret); + + sessionManagerPtr_->impl_.clientToken = CLIENT_TOKEN_ID; + ret = sessionManagerPtr_->GetIsRestoreEnd(bundleName); + EXPECT_FALSE(ret); + + BackupExtInfo backupInfo {}; + backupInfo.isRestoreEnd = true; + sessionManagerPtr_->impl_.backupExtNameMap[bundleName] = backupInfo; + EXPECT_NE(sessionManagerPtr_->impl_.backupExtNameMap.find(bundleName), + sessionManagerPtr_->impl_.backupExtNameMap.end()); + ret = sessionManagerPtr_->GetIsRestoreEnd(bundleName); + EXPECT_TRUE(ret); + } catch (...) { + EXPECT_TRUE(false); + GTEST_LOG_(INFO) << "SvcSessionManagerTest-an exception occurred by GetIsRestoreEnd."; + } + GTEST_LOG_(INFO) << "SvcSessionManagerTest-end SUB_backup_sa_session_GetIsRestoreEnd_0100"; } \ No newline at end of file -- Gitee From d43462104df202b883050c4f98f21e7933879a57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=95=E6=8C=AF=E6=9D=B0?= Date: Fri, 11 Jul 2025 10:31:57 +0800 Subject: [PATCH 2/2] fuzzer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 吕振杰 --- test/fuzztest/backupsa_fuzzer/BUILD.gn | 2 ++ test/fuzztest/backupsa_fuzzer/backupsa_fuzzer.cpp | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/test/fuzztest/backupsa_fuzzer/BUILD.gn b/test/fuzztest/backupsa_fuzzer/BUILD.gn index be88b3013..bce672d81 100644 --- a/test/fuzztest/backupsa_fuzzer/BUILD.gn +++ b/test/fuzztest/backupsa_fuzzer/BUILD.gn @@ -57,5 +57,7 @@ ohos_fuzztest("BackupSaFuzzTest") { "LOG_TAG=\"app_file_service\"", "LOG_DOMAIN=0xD004303", ] + + use_exceptions = true } ############################################################################### diff --git a/test/fuzztest/backupsa_fuzzer/backupsa_fuzzer.cpp b/test/fuzztest/backupsa_fuzzer/backupsa_fuzzer.cpp index 2f4141076..7f4e7a156 100644 --- a/test/fuzztest/backupsa_fuzzer/backupsa_fuzzer.cpp +++ b/test/fuzztest/backupsa_fuzzer/backupsa_fuzzer.cpp @@ -56,6 +56,12 @@ bool BackupSaFuzzTest(const uint8_t *data, size_t size) /* Fuzzer entry point */ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t dataSize) { - OHOS::BackupSaFuzzTest(data, dataSize); + try { + OHOS::BackupSaFuzzTest(data, dataSize); + } catch (OHOS::FileManagement::Backup::BError &err) { + HILOGE("BackupSaFuzzTest error"); + } catch (...) { + // filter other error + } return 0; } \ No newline at end of file -- Gitee