diff --git a/frameworks/native/ability/native/ability_runtime/js_ability.cpp b/frameworks/native/ability/native/ability_runtime/js_ability.cpp index 97f22d0bd451e9ec15b65ceee32fd4eda43c777e..cc92be6f1a978ccda5a8b5e7f0fd40959d7e3ef8 100644 --- a/frameworks/native/ability/native/ability_runtime/js_ability.cpp +++ b/frameworks/native/ability/native/ability_runtime/js_ability.cpp @@ -99,8 +99,13 @@ napi_value AttachJsAbilityContext(napi_env env, void *value, void *) } auto contextObj = systemModule->GetNapiValue(); auto workContext = new (std::nothrow) std::weak_ptr(ptr); - napi_coerce_to_native_binding_object( + auto coerceStatus = napi_coerce_to_native_binding_object( env, contextObj, DetachNewJsAbilityContext, AttachJsAbilityContext, workContext, nullptr); + if (coerceStatus != napi_ok) { + TAG_LOGE(AAFwkTag::ABILITY, "coerceStatus Failed: %{public}d", coerceStatus); + delete workContext; + return nullptr; + } napi_add_detached_finalizer(env, contextObj, DetachFinalizeJsAbilityContext, nullptr); napi_status status = napi_wrap(env, contextObj, workContext, [](napi_env, void* data, void*) { @@ -222,8 +227,13 @@ void JsAbility::BindContext() return; } auto workContext = new (std::nothrow) std::weak_ptr(context); - napi_coerce_to_native_binding_object( + auto coerceStatus = napi_coerce_to_native_binding_object( env, contextObj, DetachCallbackFunc, AttachJsAbilityContext, workContext, nullptr); + if (coerceStatus != napi_ok) { + TAG_LOGE(AAFwkTag::ABILITY, "coerceStatus Failed: %{public}d", coerceStatus); + delete workContext; + return; + } context->Bind(jsRuntime_, shellContextRef_.get()); napi_set_named_property(env, obj, "context", contextObj); TAG_LOGD(AAFwkTag::ABILITY, "set ability context"); diff --git a/frameworks/native/ability/native/ability_runtime/js_ui_ability.cpp b/frameworks/native/ability/native/ability_runtime/js_ui_ability.cpp index edbde5e33a52f332047b179cfa385064c7ac4923..4ab559a1d90bcc55ed638bca5c8ae7da5524a1a0 100644 --- a/frameworks/native/ability/native/ability_runtime/js_ui_ability.cpp +++ b/frameworks/native/ability/native/ability_runtime/js_ui_ability.cpp @@ -180,7 +180,12 @@ napi_value AttachJsAbilityContext(napi_env env, void *value, void *) } CHECK_POINTER_AND_RETURN(systemModule, nullptr); auto contextObj = systemModule->GetNapiValue(); - napi_coerce_to_native_binding_object(env, contextObj, DetachCallbackFunc, AttachJsAbilityContext, value, nullptr); + auto coerceStatus = napi_coerce_to_native_binding_object(env, + contextObj, DetachCallbackFunc, AttachJsAbilityContext, value, nullptr); + if (coerceStatus != napi_ok) { + TAG_LOGE(AAFwkTag::UIABILITY, "coerceStatus Failed: %{public}d", coerceStatus); + return nullptr; + } auto workContext = new (std::nothrow) std::weak_ptr(ptr); if (workContext != nullptr) { napi_status status = napi_wrap(env, contextObj, workContext, @@ -209,8 +214,13 @@ void BindContext(napi_env env, std::unique_ptr contextRef, JsRu } auto workContext = new (std::nothrow) std::weak_ptr(abilityContext); CHECK_POINTER(workContext); - napi_coerce_to_native_binding_object( + auto coerceStatus = napi_coerce_to_native_binding_object( env, contextObj, DetachCallbackFunc, AttachJsAbilityContext, workContext, nullptr); + if (coerceStatus != napi_ok) { + TAG_LOGE(AAFwkTag::UIABILITY, "coerceStatus Failed: %{public}d", coerceStatus); + delete workContext; + return; + } abilityContext->Bind(jsRuntime, contextRef.release()); napi_wrap( env, contextObj, workContext, @@ -373,8 +383,13 @@ void JsUIAbility::SetAbilityContext(std::shared_ptr abilityInfo, auto workContext = new (std::nothrow) std::weak_ptr(abilityContext_); CHECK_POINTER(workContext); - napi_coerce_to_native_binding_object( + auto coerceStatus = napi_coerce_to_native_binding_object( env, contextObj, DetachCallbackFunc, AttachJsAbilityContext, workContext, nullptr); + if (coerceStatus != napi_ok) { + TAG_LOGE(AAFwkTag::UIABILITY, "coerceStatus Failed: %{public}d", coerceStatus); + delete workContext; + return; + } abilityContext_->Bind(jsRuntime_, shellContextRef_.get()); napi_set_named_property(env, obj, "context", contextObj); TAG_LOGD(AAFwkTag::UIABILITY, "set ability context"); diff --git a/frameworks/native/ability/native/auto_fill_extension_ability/js_auto_fill_extension.cpp b/frameworks/native/ability/native/auto_fill_extension_ability/js_auto_fill_extension.cpp index 9a23275aa4daf9ab66ad9b71ed8dcf211489ef55..0aec4bf4dfeae7a80236127ecfd5116f9b540195 100644 --- a/frameworks/native/ability/native/auto_fill_extension_ability/js_auto_fill_extension.cpp +++ b/frameworks/native/ability/native/auto_fill_extension_ability/js_auto_fill_extension.cpp @@ -78,8 +78,12 @@ napi_value AttachAutoFillExtensionContext(napi_env env, void *value, void *) TAG_LOGE(AAFwkTag::AUTOFILL_EXT, "null contextObj"); return nullptr; } - napi_coerce_to_native_binding_object( + auto coerceStatus = napi_coerce_to_native_binding_object( env, contextObj, DetachCallbackFunc, AttachAutoFillExtensionContext, value, nullptr); + if (coerceStatus != napi_ok) { + TAG_LOGE(AAFwkTag::AUTOFILL_EXT, "coerceStatus Failed: %{public}d", coerceStatus); + return nullptr; + } auto workContext = new (std::nothrow) std::weak_ptr(ptr); if (workContext != nullptr) { @@ -202,8 +206,13 @@ void JsAutoFillExtension::BindContext(napi_env env, napi_value obj) TAG_LOGE(AAFwkTag::AUTOFILL_EXT, "null workContext"); return; } - napi_coerce_to_native_binding_object( + auto coerceStatus = napi_coerce_to_native_binding_object( env, contextObj, DetachCallbackFunc, AttachAutoFillExtensionContext, workContext, nullptr); + if (coerceStatus != napi_ok) { + TAG_LOGE(AAFwkTag::AUTOFILL_EXT, "coerceStatus Failed: %{public}d", coerceStatus); + delete workContext; + return; + } context->Bind(jsRuntime_, shellContextRef_.get()); napi_set_named_property(env, obj, "context", contextObj); auto status = napi_wrap(env, contextObj, workContext, diff --git a/services/abilitymgr/include/ability_manager_service.h b/services/abilitymgr/include/ability_manager_service.h index 65917fbc6acc467f1c398954254c7503ac826995..cc031a522679e4dc0ae37c4348510f4d67dfcb28 100644 --- a/services/abilitymgr/include/ability_manager_service.h +++ b/services/abilitymgr/include/ability_manager_service.h @@ -1267,7 +1267,7 @@ public: virtual void CompleteFirstFrameDrawing(int32_t sessionId) override; - sptr GetWMSHandler() const; + sptr GetWMSHandler(); virtual int PrepareTerminateAbility(const sptr &token, sptr &callback) override; @@ -2856,6 +2856,7 @@ private: void InitFocusListener(); void RegisterFocusListener(); std::shared_ptr implicitStartProcessor_; + ffrt::mutex wmsHandlerLock_; sptr wmsHandler_; #endif std::shared_ptr interceptorExecuter_; diff --git a/services/abilitymgr/src/ability_manager_service.cpp b/services/abilitymgr/src/ability_manager_service.cpp index 131a2e7556d7a616a12642cef815c591152ead3d..419b55090c66d567a4b85fc68ee7bc5ad4d9d23c 100644 --- a/services/abilitymgr/src/ability_manager_service.cpp +++ b/services/abilitymgr/src/ability_manager_service.cpp @@ -787,11 +787,11 @@ int AbilityManagerService::StartAbilityByUIContentSession(const Want &want, cons Rosen::WindowManager::GetInstance().GetFocusWindowInfo(focusChangeInfo); token = focusChangeInfo.abilityToken_; } else { - if (!wmsHandler_) { + if (!GetWMSHandler()) { TAG_LOGE(AAFwkTag::ABILITYMGR, "wmsHandler_ null"); return ERR_INVALID_VALUE; } - wmsHandler_->GetFocusWindow(token); + GetWMSHandler()->GetFocusWindow(token); } #endif // SUPPORT_SCREEN if (!token) { @@ -826,11 +826,11 @@ int AbilityManagerService::StartAbilityByUIContentSession(const Want &want, cons Rosen::WindowManager::GetInstance().GetFocusWindowInfo(focusChangeInfo); token = focusChangeInfo.abilityToken_; } else { - if (!wmsHandler_) { + if (!GetWMSHandler()) { TAG_LOGE(AAFwkTag::ABILITYMGR, "wmsHandler_ null"); return ERR_INVALID_VALUE; } - wmsHandler_->GetFocusWindow(token); + GetWMSHandler()->GetFocusWindow(token); } #endif // SUPPORT_SCREEN @@ -6348,8 +6348,8 @@ int AbilityManagerService::MoveMissionsToForeground(const std::vector& return CHECK_PERMISSION_FAILED; } #ifdef SUPPORT_SCREEN - if (wmsHandler_) { - auto ret = wmsHandler_->MoveMissionsToForeground(missionIds, topMissionId); + if (GetWMSHandler()) { + auto ret = GetWMSHandler()->MoveMissionsToForeground(missionIds, topMissionId); if (ret) { TAG_LOGE(AAFwkTag::ABILITYMGR, "moveMissionsToForeground failed, missiondIds may invalid"); return ERR_INVALID_VALUE; @@ -6370,8 +6370,8 @@ int AbilityManagerService::MoveMissionsToBackground(const std::vector& return CHECK_PERMISSION_FAILED; } #ifdef SUPPORT_SCREEN - if (wmsHandler_) { - auto ret = wmsHandler_->MoveMissionsToBackground(missionIds, result); + if (GetWMSHandler()) { + auto ret = GetWMSHandler()->MoveMissionsToBackground(missionIds, result); if (ret) { TAG_LOGE(AAFwkTag::ABILITYMGR, "moveMissionsToBackground failed, missiondIds may invalid"); return ERR_INVALID_VALUE; @@ -9934,11 +9934,11 @@ int AbilityManagerService::GetTopAbility(sptr &token) Rosen::WindowManager::GetInstance().GetFocusWindowInfo(focusChangeInfo); token = focusChangeInfo.abilityToken_; } else { - if (!wmsHandler_) { + if (!GetWMSHandler()) { TAG_LOGE(AAFwkTag::ABILITYMGR, "wmsHandler_ null"); return ERR_INVALID_VALUE; } - wmsHandler_->GetFocusWindow(token); + GetWMSHandler()->GetFocusWindow(token); } if (!token) { @@ -10699,14 +10699,16 @@ int AbilityManagerService::RegisterWindowManagerServiceHandler(const sptr guard(wmsHandlerLock_); wmsHandler_ = handler; isAnimationEnabled_ = animationEnabled; TAG_LOGI(AAFwkTag::ABILITYMGR, "WMS handler registered successfully."); return ERR_OK; } -sptr AbilityManagerService::GetWMSHandler() const +sptr AbilityManagerService::GetWMSHandler() { + std::lock_guard guard(wmsHandlerLock_); return wmsHandler_; } @@ -10931,6 +10933,7 @@ int AbilityManagerService::UnregisterAbilityFirstFrameStateObserver( bool AbilityManagerService::GetAnimationFlag() { + std::lock_guard guard(wmsHandlerLock_); return isAnimationEnabled_; } @@ -11737,12 +11740,12 @@ std::shared_ptr AbilityManagerService::GetFocusAbility() { #ifdef SUPPORT_SCREEN sptr token; - if (!wmsHandler_) { + if (!GetWMSHandler()) { TAG_LOGE(AAFwkTag::ABILITYMGR, "wmsHandler_ null"); return nullptr; } - wmsHandler_->GetFocusWindow(token); + GetWMSHandler()->GetFocusWindow(token); if (!token) { TAG_LOGE(AAFwkTag::ABILITYMGR, "token null"); return nullptr;