diff --git a/services/sa/standard/dslm_service.cpp b/services/sa/standard/dslm_service.cpp index ad0a940d37da0aa2e705876dbcd6f2a3266ca4ff..f3406132ee74458f0f1a7156f9d98c764be62640 100644 --- a/services/sa/standard/dslm_service.cpp +++ b/services/sa/standard/dslm_service.cpp @@ -29,9 +29,9 @@ namespace OHOS { namespace Security { namespace DeviceSecurityLevel { -REGISTER_SYSTEM_ABILITY_BY_ID(DslmService, DEVICE_SECURITY_LEVEL_MANAGER_SA_ID, true); +const bool REGISTER_RESULT = SystemAbility::MakeAndRegisterAbility(DslmService::GetInstance().GetRefPtr()); -DslmService::DslmService(int32_t saId, bool runOnCreate) : SystemAbility(saId, runOnCreate) +DslmService::DslmService() : SystemAbility(DEVICE_SECURITY_LEVEL_MANAGER_SA_ID, true) { SECURITY_LOG_INFO("object initialization"); } @@ -44,7 +44,7 @@ void DslmService::OnStart() if (InitService() == SUCCESS) { SECURITY_LOG_INFO("init service success"); } - if (!Publish(this)) { + if (!Publish(DslmService::GetInstance())) { SECURITY_LOG_ERROR("publish service failed"); } }); @@ -63,6 +63,18 @@ int32_t DslmService::Dump(int fd, const std::vector &args) return 0; } +sptr DslmService::GetInstance() +{ + if (!instance_) { + std::lock_guard lock(mutex_); + if (instance_ == nullptr) { + instance_ = new DslmService(); + } + } + + return instance_; +} + int32_t DslmService::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) { do { diff --git a/services/sa/standard/dslm_service.h b/services/sa/standard/dslm_service.h index e88a8b19d70163131af973fc26d11f35133d98a7..ecdc12150ab524b1c7e472e1679f05ca22214d26 100644 --- a/services/sa/standard/dslm_service.h +++ b/services/sa/standard/dslm_service.h @@ -18,6 +18,9 @@ #include #include +#include +#include +#include #include #include @@ -37,14 +40,17 @@ class DslmService : public SystemAbility, public IRemoteStub &args) override; int32_t OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option) override; + static sptr GetInstance(); private: + static sptr instance_; + static std::mutex mutex_; int32_t ProcessGetDeviceSecurityLevel(MessageParcel &data, MessageParcel &reply); }; } // namespace DeviceSecurityLevel diff --git a/test/dslm_fuzz_test/dslm_fuzzer/dslm_fuzzer.cpp b/test/dslm_fuzz_test/dslm_fuzzer/dslm_fuzzer.cpp index f29fba0837b71406c85eef0e8c8fce468f2c4402..c8d692e3aa13f6bb434fca6f2bb40f51519a7c18 100644 --- a/test/dslm_fuzz_test/dslm_fuzzer/dslm_fuzzer.cpp +++ b/test/dslm_fuzz_test/dslm_fuzzer/dslm_fuzzer.cpp @@ -31,7 +31,7 @@ namespace DeviceSecurityLevel { namespace { const uint8_t mockBuffer[DEVICE_ID_MAX_LEN] = {0}; -DslmService g_dslmService(DEVICE_SECURITY_LEVEL_MANAGER_SA_ID, true); +DslmService g_dslmService(); void OnPeerMsgReceivedFuzzer(Parcel &parcel) {