diff --git a/cj_environment/frameworks/cj_environment/src/dynamic_loader_ohos.cpp b/cj_environment/frameworks/cj_environment/src/dynamic_loader_ohos.cpp index 300c695dab47b9e671f9bffe96ee64f3cfdf14ff..17ff85a13457a0c97638f69b9c68864a5f52898c 100644 --- a/cj_environment/frameworks/cj_environment/src/dynamic_loader_ohos.cpp +++ b/cj_environment/frameworks/cj_environment/src/dynamic_loader_ohos.cpp @@ -18,6 +18,7 @@ #include "cj_hilog.h" #include #include +#include #include #include #include @@ -25,6 +26,7 @@ namespace { constexpr auto ERROR_BUF_SIZE = 255; static char g_dlError[ERROR_BUF_SIZE]; +static std::mutex globalErrorMutex; static std::unordered_set HasInited; static char* g_sharedLibsSonames = nullptr; @@ -40,6 +42,7 @@ static void ReadDlError() if (!errMsg) { return; } + std::lock_guard lock(globalErrorMutex); auto ends = sprintf_s(g_dlError, sizeof(g_dlError), "%s", errMsg); if (ends >= ERROR_BUF_SIZE) { g_dlError[ERROR_BUF_SIZE - 1] = '\0'; @@ -144,6 +147,7 @@ void DynamicInitNamespace(Dl_namespace* ns, const char* entries, const char* nam default: errMsg = "dlns_create failed, status: " + std::to_string(status); } + std::lock_guard lock(globalErrorMutex); if (sprintf_s(g_dlError, sizeof(g_dlError), errMsg.c_str()) == -1) { LOGE("Fail to generate error msg."); return; diff --git a/frameworks/ets/ani/ui_ability/src/ets_ability_context.cpp b/frameworks/ets/ani/ui_ability/src/ets_ability_context.cpp index 8c04bebaca9effa0753de21846e31aff5f59d595..48b19ea07bbf48b06b91582b3a36cc9ccd381a57 100644 --- a/frameworks/ets/ani/ui_ability/src/ets_ability_context.cpp +++ b/frameworks/ets/ani/ui_ability/src/ets_ability_context.cpp @@ -380,7 +380,10 @@ void EtsAbilityContext::OnStartAbilityForResult( return; } AAFwk::Want want; - AppExecFwk::UnwrapWant(env, wantObj, want); + if (!AppExecFwk::UnwrapWant(env, wantObj, want)) { + EtsErrorUtil::ThrowInvalidParamError(env, "Parse param want failed, must be a Want"); + return; + } AAFwk::StartOptions startOptions; if (startOptionsObj) { AppExecFwk::UnwrapStartOptions(env, startOptionsObj, startOptions); @@ -484,7 +487,12 @@ void EtsAbilityContext::OnTerminateSelfWithResult( } AAFwk::Want want; int resultCode = 0; - AppExecFwk::UnWrapAbilityResult(env, abilityResult, resultCode, want); + if (!AppExecFwk::UnWrapAbilityResult(env, abilityResult, resultCode, want)) { + TAG_LOGE(AAFwkTag::CONTEXT, "parse ability result failed"); + EtsErrorUtil::ThrowInvalidParamError(env, + "Parameter error: Failed to parse parameter! Parameter must be a AbilityResult."); + return; + } context->SetTerminating(true); ErrCode ret = context->TerminateAbilityWithResult(want, resultCode); if (ret == static_cast(AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT) || ret == ERR_OK) { diff --git a/frameworks/js/napi/feature_ability/js_feature_ability.cpp b/frameworks/js/napi/feature_ability/js_feature_ability.cpp index ff7b67dfac0765db8eb8c76ccaa95b8ccefa4ccd..3687db4b288a3e1a2b208db0d9edaf49a36c0ca5 100644 --- a/frameworks/js/napi/feature_ability/js_feature_ability.cpp +++ b/frameworks/js/napi/feature_ability/js_feature_ability.cpp @@ -199,12 +199,31 @@ napi_value JsFeatureAbility::OnFinishWithResult(napi_env env, NapiCallbackInfo& napi_value globalValue = nullptr; napi_get_global(env, &globalValue); - napi_value jsonValue; + if (!globalValue) { + TAG_LOGE(AAFwkTag::FA, "get value failed"); + return nullptr; + } + + napi_value jsonValue = nullptr; napi_get_named_property(env, globalValue, "JSON", &jsonValue); + if (!jsonValue) { + TAG_LOGE(AAFwkTag::FA, "get value failed"); + return nullptr; + } + napi_value stringifyValue = nullptr; napi_get_named_property(env, jsonValue, "stringify", &stringifyValue); + if (!stringifyValue) { + TAG_LOGE(AAFwkTag::FA, "get value failed"); + return nullptr; + } + napi_value transValue = nullptr; - napi_call_function(env, jsonValue, stringifyValue, 1, &jsResultObj, &transValue); + napi_status status = napi_call_function(env, jsonValue, stringifyValue, 1, &jsResultObj, &transValue); + if (status != napi_ok) { + TAG_LOGE(AAFwkTag::FA, "call failed %{public}d", status); + return nullptr; + } std::string resultStr {}; resultStr = UnwrapStringFromJS(env, transValue, ""); @@ -494,6 +513,11 @@ napi_value JsFeatureAbilityInit(napi_env env, napi_value exports) napi_value global = nullptr; napi_get_global(env, &global); + if (!global) { + TAG_LOGE(AAFwkTag::FA, "get global failed"); + return nullptr; + } + if (!CheckTypeForNapiValue(env, global, napi_object)) { TAG_LOGE(AAFwkTag::FA, "not NativeObject"); return nullptr; diff --git a/frameworks/js/napi/inner/napi_ability_common/napi_common_ability.cpp b/frameworks/js/napi/inner/napi_ability_common/napi_common_ability.cpp index a2511b6c0ee01af549d56bab8a3a9feb86feaa1f..aad4d4b9d38313dc563b2f365a9efb8bb84e41b2 100644 --- a/frameworks/js/napi/inner/napi_ability_common/napi_common_ability.cpp +++ b/frameworks/js/napi/inner/napi_ability_common/napi_common_ability.cpp @@ -38,30 +38,36 @@ namespace OHOS { namespace AppExecFwk { napi_ref thread_local g_contextObject = nullptr; napi_ref thread_local g_dataAbilityHelper = nullptr; +static std::mutex globalContextMutex; +static std::mutex globalAbilityHelperMutex; bool thread_local g_dataAbilityHelperStatus = false; using NAPICreateJsRemoteObject = napi_value (*)(napi_env env, const sptr target); napi_status SetGlobalClassContext(napi_env env, napi_value constructor) { + std::lock_guard lock(globalContextMutex); return napi_create_reference(env, constructor, 1, &g_contextObject); } napi_value GetGlobalClassContext(napi_env env) { napi_value constructor; + std::lock_guard lock(globalContextMutex); NAPI_CALL(env, napi_get_reference_value(env, g_contextObject, &constructor)); return constructor; } napi_status SaveGlobalDataAbilityHelper(napi_env env, napi_value constructor) { + std::lock_guard lock(globalAbilityHelperMutex); return napi_create_reference(env, constructor, 1, &g_dataAbilityHelper); } napi_value GetGlobalDataAbilityHelper(napi_env env) { napi_value constructor; + std::lock_guard lock(globalAbilityHelperMutex); NAPI_CALL(env, napi_get_reference_value(env, g_dataAbilityHelper, &constructor)); return constructor; } diff --git a/frameworks/js/napi/inner/napi_ability_common/napi_common_ability_execute_utils.cpp b/frameworks/js/napi/inner/napi_ability_common/napi_common_ability_execute_utils.cpp index ad098fa18e4b3ed463186f1e8269a603ea398a7a..ed96261ff3e17fc0d5323dbe296f9154c32240a7 100644 --- a/frameworks/js/napi/inner/napi_ability_common/napi_common_ability_execute_utils.cpp +++ b/frameworks/js/napi/inner/napi_ability_common/napi_common_ability_execute_utils.cpp @@ -66,7 +66,10 @@ void GetAppTypeAsyncCompleteCB(napi_env env, napi_status, void *data) napi_value result[ARGS_TWO] = {nullptr}; napi_value callResult = nullptr; NAPI_CALL_RETURN_VOID(env, napi_get_undefined(env, &undefined)); - + if (!appTypeCB) { + TAG_LOGE(AAFwkTag::JSNAPI, "null appTypeCB"); + return; + } result[PARAM0] = GetCallbackErrorValue(env, appTypeCB->cbBase.errCode); if (appTypeCB->cbBase.errCode == NAPI_ERR_NO_ERROR) { NAPI_CALL_RETURN_VOID(env, @@ -97,8 +100,16 @@ void GetAppTypePromiseCompleteCB(napi_env env, napi_status, void *data) { TAG_LOGI(AAFwkTag::JSNAPI, "called"); AppTypeCB *appTypeCB = static_cast(data); + if (!appTypeCB) { + TAG_LOGE(AAFwkTag::JSNAPI, "null appTypeCB"); + return; + } napi_value result = nullptr; if (appTypeCB->cbBase.errCode == NAPI_ERR_NO_ERROR) { + if (!(appTypeCB->cbBase.ability)) { + TAG_LOGE(AAFwkTag::JSNAPI, "null appTypeCB->cbBase.ability"); + return; + } napi_create_string_utf8(env, appTypeCB->cbBase.ability->GetAppType().c_str(), NAPI_AUTO_LENGTH, &result); napi_resolve_deferred(env, appTypeCB->cbBase.deferred, result); } else { diff --git a/frameworks/js/napi/inner/napi_ability_common/napi_context.cpp b/frameworks/js/napi/inner/napi_ability_common/napi_context.cpp index 323d4a525021ca44910776c5f2fef2831426ab99..2c86ea7800298d657a415525285717d579b2769f 100644 --- a/frameworks/js/napi/inner/napi_ability_common/napi_context.cpp +++ b/frameworks/js/napi/inner/napi_ability_common/napi_context.cpp @@ -405,6 +405,10 @@ void GetOrCreateLocalDirAsyncCompleteCB(napi_env env, napi_status status, void * { TAG_LOGI(AAFwkTag::JSNAPI, "complete"); GetOrCreateLocalDirCB *getOrCreateLocalDirCB = static_cast(data); + if (getOrCreateLocalDirCB == nullptr) { + TAG_LOGE(AAFwkTag::JSNAPI, "null getOrCreateLocalDirCB"); + return; + } napi_value callback = nullptr; napi_value undefined = nullptr; napi_value result[ARGS_TWO] = {nullptr}; diff --git a/frameworks/js/napi/js_child_process_manager/js_child_process_manager.cpp b/frameworks/js/napi/js_child_process_manager/js_child_process_manager.cpp index 2133628e8486cdbd787802179e4644e4c038a509..cc64212eac60932170a6cb9b0bc6d3d4ceee21e6 100644 --- a/frameworks/js/napi/js_child_process_manager/js_child_process_manager.cpp +++ b/frameworks/js/napi/js_child_process_manager/js_child_process_manager.cpp @@ -51,7 +51,12 @@ public: static void Finalizer(napi_env env, void* data, void* hint) { TAG_LOGI(AAFwkTag::PROCESSMGR, "Called"); - std::unique_ptr(static_cast(data)); + auto jsChildProcessManager = static_cast(data); + if (!jsChildProcessManager) { + TAG_LOGE(AAFwkTag::PROCESSMGR, "cast to js child manager failed"); + return; + } + std::unique_ptr ptr(jsChildProcessManager); } static napi_value StartChildProcess(napi_env env, napi_callback_info info) diff --git a/frameworks/native/ability/ability_runtime/ability_connection.cpp b/frameworks/native/ability/ability_runtime/ability_connection.cpp index d12408baeaddb5d9ebf94446b8e49ddf38c823cf..29051af86ce7ae434d0740219af252c4dbb2c029 100644 --- a/frameworks/native/ability/ability_runtime/ability_connection.cpp +++ b/frameworks/native/ability/ability_runtime/ability_connection.cpp @@ -32,8 +32,7 @@ void AbilityConnection::OnAbilityConnectDone( TAG_LOGI(AAFwkTag::CONNECTION, "OnAbilityConnectDone, bundleName:%{public}s, abilityName:%{public}s, resultCode:%{public}d", element.GetBundleName().c_str(), element.GetAbilityName().c_str(), resultCode); - mutex_.lock(); - if (abilityConnectCallbackList_.empty()) { + if (IsCallbackListEmpty()) { TAG_LOGW(AAFwkTag::CONNECTION, "empty callbackList"); mutex_.unlock(); return; @@ -44,7 +43,6 @@ void AbilityConnection::OnAbilityConnectDone( SetConnectionState(CONNECTION_STATE_CONNECTED); std::vector> callbacks = GetCallbackList(); - mutex_.unlock(); sptr connection(this); if (ConnectionManager::GetInstance().DisconnectNonexistentService(element, connection)) { TAG_LOGW(AAFwkTag::CONNECTION, "No need onConnect callback"); @@ -63,16 +61,13 @@ void AbilityConnection::OnAbilityDisconnectDone(const AppExecFwk::ElementName& e TAG_LOGI(AAFwkTag::CONNECTION, "OnAbilityDisconnectDone, bundleName:%{public}s, abilityName:%{public}s, resultCode:%{public}d", element.GetBundleName().c_str(), element.GetAbilityName().c_str(), resultCode); - mutex_.lock(); SetConnectionState(CONNECTION_STATE_DISCONNECTED); - if (abilityConnectCallbackList_.empty()) { + if (IsCallbackListEmpty()) { TAG_LOGE(AAFwkTag::CONNECTION, "empty callbackList"); - mutex_.unlock(); return; } std::vector> callbacks = GetCallbackList(); - mutex_.unlock(); // if resultCode < 0 that means the service is dead if (resultCode == DIED) { @@ -152,7 +147,14 @@ int AbilityConnection::GetConnectionState() const std::vector> AbilityConnection::GetCallbackList() { + std::lock_guard lock(mutex_); return abilityConnectCallbackList_; } + +bool AbilityConnection::IsCallbackListEmpty() +{ + std::lock_guard lock(mutex_); + return abilityConnectCallbackList_.empty(); +} } // namespace AbilityRuntime } // namespace OHOS diff --git a/frameworks/native/ability/ability_runtime/ability_context_impl.cpp b/frameworks/native/ability/ability_runtime/ability_context_impl.cpp index 508332afb22a991f9aa44e7dc855c9a66e33bf63..44de6bd2cfc2411dc002bc9260323998f17f8c43 100644 --- a/frameworks/native/ability/ability_runtime/ability_context_impl.cpp +++ b/frameworks/native/ability/ability_runtime/ability_context_impl.cpp @@ -242,7 +242,10 @@ ErrCode AbilityContextImpl::StartAbilityWithAccount( ErrCode AbilityContextImpl::StartAbilityForResult(const AAFwk::Want& want, int requestCode, RuntimeTask&& task) { TAG_LOGD(AAFwkTag::CONTEXT, "called"); - resultCallbacks_.insert(make_pair(requestCode, std::move(task))); + { + std::lock_guard lock(resultCallbacksMutex_); + resultCallbacks_.insert(make_pair(requestCode, std::move(task))); + } ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, token_, requestCode, -1); if (err != ERR_OK && err != AAFwk::START_ABILITY_WAITING) { TAG_LOGE(AAFwkTag::CONTEXT, "ret=%{public}d", err); @@ -255,7 +258,10 @@ ErrCode AbilityContextImpl::StartAbilityForResultWithAccount( const AAFwk::Want& want, const int accountId, int requestCode, RuntimeTask&& task) { TAG_LOGD(AAFwkTag::CONTEXT, "accountId:%{private}d", accountId); - resultCallbacks_.insert(make_pair(requestCode, std::move(task))); + { + std::lock_guard lock(resultCallbacksMutex_); + resultCallbacks_.insert(make_pair(requestCode, std::move(task))); + } ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, token_, requestCode, accountId); if (err != ERR_OK && err != AAFwk::START_ABILITY_WAITING) { TAG_LOGE(AAFwkTag::CONTEXT, "ret=%{public}d", err); @@ -268,7 +274,10 @@ ErrCode AbilityContextImpl::StartAbilityForResult(const AAFwk::Want& want, const int requestCode, RuntimeTask&& task) { TAG_LOGD(AAFwkTag::CONTEXT, "called"); - resultCallbacks_.insert(make_pair(requestCode, std::move(task))); + { + std::lock_guard lock(resultCallbacksMutex_); + resultCallbacks_.insert(make_pair(requestCode, std::move(task))); + } ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want, startOptions, token_, requestCode); if (err != ERR_OK && err != AAFwk::START_ABILITY_WAITING) { TAG_LOGE(AAFwkTag::CONTEXT, "ret=%{public}d", err); @@ -288,7 +297,10 @@ ErrCode AbilityContextImpl::StartAbilityForResultWithAccount( int requestCode, RuntimeTask&& task) { TAG_LOGD(AAFwkTag::CONTEXT, "called"); - resultCallbacks_.insert(make_pair(requestCode, std::move(task))); + { + std::lock_guard lock(resultCallbacksMutex_); + resultCallbacks_.insert(make_pair(requestCode, std::move(task))); + } ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility( want, startOptions, token_, requestCode, accountId); if (err != ERR_OK && err != AAFwk::START_ABILITY_WAITING) { @@ -411,6 +423,7 @@ int32_t AbilityContextImpl::GetAbilityRecordId() void AbilityContextImpl::OnAbilityResult(int requestCode, int resultCode, const AAFwk::Want& resultData) { TAG_LOGD(AAFwkTag::CONTEXT, "called"); + std::lock_guard lock(resultCallbacksMutex_); auto callback = resultCallbacks_.find(requestCode); if (callback != resultCallbacks_.end()) { if (callback->second) { @@ -423,6 +436,7 @@ void AbilityContextImpl::OnAbilityResult(int requestCode, int resultCode, const void AbilityContextImpl::OnAbilityResultInner(int requestCode, int resultCode, const AAFwk::Want& resultData) { TAG_LOGD(AAFwkTag::CONTEXT, "called"); + std::lock_guard lock(resultCallbacksMutex_); auto callback = resultCallbacks_.find(requestCode); if (callback != resultCallbacks_.end()) { if (callback->second) { @@ -524,11 +538,13 @@ void AbilityContextImpl::RegisterAbilityConfigUpdateCallback( std::shared_ptr AbilityContextImpl::GetAbilityConfiguration() const { + std::lock_guard lock(abilityConfigurationMutex_); return abilityConfiguration_; } void AbilityContextImpl::SetAbilityConfiguration(const AppExecFwk::Configuration &config) { + std::lock_guard lock(abilityConfigurationMutex_); if (!abilityConfiguration_) { abilityConfiguration_ = std::make_shared(config); TAG_LOGI(AAFwkTag::CONTEXT, "abilityConfiguration: %{public}s", abilityConfiguration_->GetName().c_str()); @@ -889,15 +905,19 @@ void AbilityContextImpl::RequestDialogResultJSThreadWorker(uv_work_t* work, int ErrCode AbilityContextImpl::GetMissionId(int32_t &missionId) { TAG_LOGD(AAFwkTag::CONTEXT, "called"); - if (missionId_ != -1) { - missionId = missionId_; - return ERR_OK; + { + std::lock_guard lock(missionIdMutex_); + if (missionId_ != -1) { + missionId = missionId_; + return ERR_OK; + } } ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->GetMissionIdByToken(token_, missionId); if (err != ERR_OK) { TAG_LOGE(AAFwkTag::CONTEXT, "failed %{public}d", err); } else { + std::lock_guard lock(missionIdMutex_); missionId_ = missionId; TAG_LOGD(AAFwkTag::CONTEXT, "missionId: %{public}d", missionId_); } @@ -928,12 +948,14 @@ ErrCode AbilityContextImpl::SetMissionContinueState(const AAFwk::ContinueState & void AbilityContextImpl::InsertResultCallbackTask(int requestCode, RuntimeTask &&task) { TAG_LOGD(AAFwkTag::CONTEXT, "called"); + std::lock_guard lock(resultCallbacksMutex_); resultCallbacks_.insert(make_pair(requestCode, std::move(task))); } void AbilityContextImpl::RemoveResultCallbackTask(int requestCode) { TAG_LOGD(AAFwkTag::CONTEXT, "call"); + std::lock_guard lock(resultCallbacksMutex_); resultCallbacks_.erase(requestCode); } @@ -1222,7 +1244,10 @@ ErrCode AbilityContextImpl::OpenAtomicService(AAFwk::Want& want, const AAFwk::St RuntimeTask &&task) { TAG_LOGD(AAFwkTag::CONTEXT, "called"); - resultCallbacks_.insert(make_pair(requestCode, std::move(task))); + { + std::lock_guard lock(resultCallbacksMutex_); + resultCallbacks_.insert(make_pair(requestCode, std::move(task))); + } ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->OpenAtomicService(want, options, token_, requestCode, -1); if (err != ERR_OK && err != AAFwk::START_ABILITY_WAITING) { TAG_LOGE(AAFwkTag::CONTEXT, "failed, ret=%{public}d", err); diff --git a/frameworks/native/ability/ability_runtime/local_call_record.cpp b/frameworks/native/ability/ability_runtime/local_call_record.cpp index 7a084cbe573c64971104e0b4f6f61346563baa47..0b2a85363f2ec3d44e0e648b128fa68f2e3ddf5b 100644 --- a/frameworks/native/ability/ability_runtime/local_call_record.cpp +++ b/frameworks/native/ability/ability_runtime/local_call_record.cpp @@ -22,7 +22,7 @@ namespace { constexpr int32_t FOREGROUND = 2; constexpr int32_t BACKGROUND = 4; } -int64_t LocalCallRecord::callRecordId = 0; +std::atomic LocalCallRecord::callRecordId = 0; LocalCallRecord::LocalCallRecord(const AppExecFwk::ElementName& elementName) { recordId_ = callRecordId++; diff --git a/frameworks/native/ability/native/ui_extension_base/js_ui_extension_context.cpp b/frameworks/native/ability/native/ui_extension_base/js_ui_extension_context.cpp index c9fdab9b766d0a77afd2f8e94a2d8a15608dbe95..10d11aabcad2cd2d7374e857127f5b47a244fb41 100755 --- a/frameworks/native/ability/native/ui_extension_base/js_ui_extension_context.cpp +++ b/frameworks/native/ability/native/ui_extension_base/js_ui_extension_context.cpp @@ -63,10 +63,12 @@ const std::string KEY_REQUEST_ID = "com.ohos.param.requestId"; const std::string ATOMIC_SERVICE_PREFIX = "com.atomicservice."; } // namespace +static std::mutex g_connectMtx; static std::map, key_compare> g_connects; -static int64_t g_serialNumber = 0; +static std::atomic g_serialNumber = 0; void RemoveConnection(int64_t connectId) { + std::lock_guard lock(g_connectMtx); auto item = std::find_if(g_connects.begin(), g_connects.end(), [&connectId](const auto &obj) { return connectId == obj.first.id; @@ -85,6 +87,7 @@ void RemoveConnection(int64_t connectId) void FindConnection(AAFwk::Want& want, sptr& connection, int64_t& connectId) { TAG_LOGD(AAFwkTag::UI_EXT, "Disconnect ability enter, connection:%{public}" PRId64, connectId); + std::lock_guard lock(g_connectMtx); auto item = std::find_if(g_connects.begin(), g_connects.end(), [&connectId](const auto &obj) { @@ -110,7 +113,10 @@ bool CheckConnectionParam(napi_env env, napi_value value, sptrSetConnectionId(key.id); - g_connects.emplace(key, connection); + { + std::lock_guard lock(g_connectMtx); + g_connects.emplace(key, connection); + } g_serialNumber = (g_serialNumber + 1) % INT32_MAX; TAG_LOGD(AAFwkTag::UI_EXT, "not find connection, create a new connection"); return true; diff --git a/frameworks/native/ability/native/ui_extension_base/ui_extension_context.cpp b/frameworks/native/ability/native/ui_extension_base/ui_extension_context.cpp index b1055074ee5d8457cf9188c0f7671c020713e560..24630e6cc166a25fc098c00eae0e3c43db048c23 100755 --- a/frameworks/native/ability/native/ui_extension_base/ui_extension_context.cpp +++ b/frameworks/native/ability/native/ui_extension_base/ui_extension_context.cpp @@ -327,7 +327,10 @@ ErrCode UIExtensionContext::OpenAtomicService(AAFwk::Want& want, const AAFwk::St RuntimeTask &&task) { TAG_LOGD(AAFwkTag::UI_EXT, "called"); - resultCallbacks_.insert(make_pair(requestCode, std::move(task))); + { + std::lock_guard lock(mutexlock_); + resultCallbacks_.insert(make_pair(requestCode, std::move(task))); + } ErrCode err = AAFwk::AbilityManagerClient::GetInstance()->OpenAtomicService(want, options, token_, requestCode); if (err != ERR_OK && err != AAFwk::START_ABILITY_WAITING) { TAG_LOGE(AAFwkTag::UI_EXT, "ret = %{public}d", err); diff --git a/frameworks/native/appkit/ability_delegator/ability_delegator_registry.cpp b/frameworks/native/appkit/ability_delegator/ability_delegator_registry.cpp index bfdc3298b9acaca3b9adde777785904821b8e810..df7bb786f81210a16cc586946aa41c08aa9bf475 100644 --- a/frameworks/native/appkit/ability_delegator/ability_delegator_registry.cpp +++ b/frameworks/native/appkit/ability_delegator/ability_delegator_registry.cpp @@ -24,10 +24,13 @@ std::shared_ptr AbilityDelegatorRegistry::abilityDelegator std::shared_ptr AbilityDelegatorRegistry::GetAbilityDelegator( const AbilityRuntime::Runtime::Language &language) { + std::lock_guard lock(delegatorMapMutex_); auto it = abilityDelegator_.find(language); if (it != abilityDelegator_.end()) { - auto p = reinterpret_cast(it->second.get()); - return std::shared_ptr(it->second, p); + auto p = dynamic_cast(it->second.get()); + if (!p) { + return std::shared_ptr(it->second, p); + } } return nullptr; } @@ -35,10 +38,13 @@ std::shared_ptr AbilityDelegatorRegistry::GetAbilityDelegator( #ifdef CJ_FRONTEND std::shared_ptr AbilityDelegatorRegistry::GetCJAbilityDelegator() { + std::lock_guard lock(delegatorMapMutex_); auto it = abilityDelegator_.find(AbilityRuntime::Runtime::Language::CJ); if (it != abilityDelegator_.end()) { - auto p = reinterpret_cast(it->second.get()); - return std::shared_ptr(it->second, p); + auto p = dynamic_cast(it->second.get()); + if (!p) { + return std::shared_ptr(it->second, p); + } } return nullptr; } @@ -46,13 +52,18 @@ std::shared_ptr AbilityDelegatorRegistry::GetCJAbilityDe std::shared_ptr AbilityDelegatorRegistry::GetArguments() { + std::lock_guard lock(delegatorArgsMutex_); return abilityDelegatorArgs_; } void AbilityDelegatorRegistry::RegisterInstance(const std::shared_ptr &delegator, const std::shared_ptr &args, const AbilityRuntime::Runtime::Language &language) { - abilityDelegatorArgs_ = args; + { + std::lock_guard lock(delegatorArgsMutex_); + abilityDelegatorArgs_ = args; + } + std::lock_guard lock(delegatorMapMutex_); abilityDelegator_.insert_or_assign(language, delegator); } } // namespace AppExecFwk diff --git a/interfaces/kits/native/ability/ability_runtime/ability_connection.h b/interfaces/kits/native/ability/ability_runtime/ability_connection.h index 020794736e1a74a63f99f3559fbc449b92b952b6..4942ca67ccb4211fc9330fa5ce2a6df7f7392575 100644 --- a/interfaces/kits/native/ability/ability_runtime/ability_connection.h +++ b/interfaces/kits/native/ability/ability_runtime/ability_connection.h @@ -87,6 +87,8 @@ public: int GetConnectionState() const; std::vector> GetCallbackList(); + + bool IsCallbackListEmpty(); private: std::vector> abilityConnectCallbackList_; sptr remoteObject_ = nullptr; diff --git a/interfaces/kits/native/ability/ability_runtime/ability_context_impl.h b/interfaces/kits/native/ability/ability_runtime/ability_context_impl.h index b644eff67a02a926ed3d0c4e6693281558801988..c20f9baf6a78d4ee5bfc528ed4dd52ef96f7ae40 100644 --- a/interfaces/kits/native/ability/ability_runtime/ability_context_impl.h +++ b/interfaces/kits/native/ability/ability_runtime/ability_context_impl.h @@ -387,12 +387,14 @@ private: sptr token_ = nullptr; std::shared_ptr abilityInfo_ = nullptr; std::shared_ptr stageContext_ = nullptr; + std::mutex resultCallbacksMutex_; std::map resultCallbacks_; std::unique_ptr contentStorage_ = nullptr; std::shared_ptr config_ = nullptr; std::shared_ptr localCallContainer_ = nullptr; std::weak_ptr abilityCallback_; std::atomic isTerminating_ = false; + std::mutex missionIdMutex_; int32_t missionId_ = -1; int32_t abilityRecordId_ = 0; std::mutex sessionTokenMutex_; @@ -402,6 +404,7 @@ private: std::atomic restoreEnabled_ = false; std::shared_ptr abilityResourceMgr_ = nullptr; AbilityConfigUpdateCallback abilityConfigUpdateCallback_ = nullptr; + mutable std::mutex abilityConfigurationMutex_; std::shared_ptr abilityConfiguration_ = nullptr; bool isHook_ = false; bool hookOff_ = false; diff --git a/interfaces/kits/native/ability/ability_runtime/local_call_record.h b/interfaces/kits/native/ability/ability_runtime/local_call_record.h index c3fb7847e751b640b18ea21a23e4030fe63adaf1..b66f8a792f599bbc3c0b11f91a0d3f45657f45d7 100644 --- a/interfaces/kits/native/ability/ability_runtime/local_call_record.h +++ b/interfaces/kits/native/ability/ability_runtime/local_call_record.h @@ -52,7 +52,7 @@ public: void SetUserId(int32_t userId); int32_t GetUserId() const; private: - static int64_t callRecordId; + static std::atomic callRecordId; int recordId_ = 0; int32_t userId_ = -1; sptr remoteObject_ = nullptr; diff --git a/interfaces/kits/native/appkit/ability_delegator/ability_delegator_registry.h b/interfaces/kits/native/appkit/ability_delegator/ability_delegator_registry.h index 57f9c383be7d8d3bf41457d9cfe902ea43a2a0f5..973ad02022f8f363a12056cab3d75c42953b3aa5 100644 --- a/interfaces/kits/native/appkit/ability_delegator/ability_delegator_registry.h +++ b/interfaces/kits/native/appkit/ability_delegator/ability_delegator_registry.h @@ -68,6 +68,8 @@ public: private: static std::map> abilityDelegator_; static std::shared_ptr abilityDelegatorArgs_; + static std::mutex delegatorMapMutex_; + static std::mutex delegatorArgsMutex_; }; } // namespace AppExecFwk } // namespace OHOS diff --git a/test/new_test/unit_test/ability_connection_unit_test/ability_connection_unit_test.cpp b/test/new_test/unit_test/ability_connection_unit_test/ability_connection_unit_test.cpp index f727b5b67499f4dedc5d69362c1e64a817cc0c03..b427cf3113efa9f6398465c14a6af0d27b9fdc72 100644 --- a/test/new_test/unit_test/ability_connection_unit_test/ability_connection_unit_test.cpp +++ b/test/new_test/unit_test/ability_connection_unit_test/ability_connection_unit_test.cpp @@ -445,5 +445,19 @@ HWTEST_F(AbilityConnectionTest, GetCallbackList_001, TestSize.Level1) EXPECT_NE(instance, nullptr); EXPECT_EQ(instance->GetCallbackList(), instance->abilityConnectCallbackList_); } + +/** + * @tc.name: IsCallbackListEmpty_001 + * @tc.desc: Verify IsCallbackListEmpty call. + * Branch NA + * @tc.type: FUNC + */ +HWTEST_F(AbilityConnectionTest, IsCallbackListEmpty_001, TestSize.Level1) +{ + sptr instance = + sptr::MakeSptr(); + EXPECT_NE(instance, nullptr); + EXPECT_EQ(instance->IsCallbackListEmpty(), true); +} } // namespace AppExecFwk } // namespace OHOS \ No newline at end of file diff --git a/test/unittest/ability_connection_test/ability_connection_test.cpp b/test/unittest/ability_connection_test/ability_connection_test.cpp index 42a3f5d32aa1198926eddf8a884de78af9b23d4a..c65618ab6d62e2f5aa73e2e3c4388f1cb4edc32d 100644 --- a/test/unittest/ability_connection_test/ability_connection_test.cpp +++ b/test/unittest/ability_connection_test/ability_connection_test.cpp @@ -279,5 +279,18 @@ HWTEST_F(AbilityConnectionTest, AbilityRuntime_AbilityConnection_GetCallbackList EXPECT_EQ(abilityConnection->GetCallbackList(), abilityConnection->abilityConnectCallbackList_); GTEST_LOG_(INFO) << "AbilityRuntime_AbilityConnection_GetCallbackList_0100 end"; } + +/** + * @tc.number: AbilityRuntime_AbilityConnection_IsCallbackListEmpty_0100 + * @tc.name: IsCallbackListEmpty + * @tc.desc: Test whether IsCallbackListEmpty is called normally. + */ +HWTEST_F(AbilityConnectionTest, AbilityRuntime_AbilityConnection_IsCallbackListEmpty_0100, TestSize.Level1) +{ + GTEST_LOG_(INFO) << "AbilityRuntime_AbilityConnection_IsCallbackListEmpty_0100 start"; + sptr abilityConnection = new AbilityConnection(); + EXPECT_EQ(abilityConnection->IsCallbackListEmpty(), true); + GTEST_LOG_(INFO) << "AbilityRuntime_AbilityConnection_IsCallbackListEmpty_0100 end"; +} } // namespace AAFwk } // namespace OHOS \ No newline at end of file