diff --git a/frameworks/ets/ani/accesstoken/src/ability_access_ctrl.cpp b/frameworks/ets/ani/accesstoken/src/ability_access_ctrl.cpp index b4954d76125e8df9e987f64120c83fdbbd471954..73dba25bde923ddca381c180a855c22d6ec487ed 100644 --- a/frameworks/ets/ani/accesstoken/src/ability_access_ctrl.cpp +++ b/frameworks/ets/ani/accesstoken/src/ability_access_ctrl.cpp @@ -420,22 +420,21 @@ static ani_object WrapResult(ani_env* env, std::shared_ptr& return nullptr; } auto state = asyncContext->needDynamicRequest ? asyncContext->grantResults : asyncContext->permissionsState; - ani_ref strPermissions = ConvertAniArrayString(env, asyncContext->permissionList); - ani_ref intAuthResults = ConvertAniArrayInt(env, state); - ani_ref boolDialogShownResults = ConvertAniArrayBool(env, asyncContext->dialogShownResults); - ani_ref intPermissionQueryResults = ConvertAniArrayInt(env, asyncContext->permissionQueryResults); - if (strPermissions == nullptr || intAuthResults == nullptr || boolDialogShownResults == nullptr || - intPermissionQueryResults == nullptr) { - asyncContext->result = RET_FAILED; - return nullptr; - } - if (!CallSetter(env, cls, aObject, SETTER_METHOD_NAME(permissions), strPermissions) || - !CallSetter(env, cls, aObject, SETTER_METHOD_NAME(authResults), intAuthResults) || - !CallSetter(env, cls, aObject, SETTER_METHOD_NAME(dialogShownResults), boolDialogShownResults) || - !CallSetter(env, cls, aObject, SETTER_METHOD_NAME(errorReasons), intPermissionQueryResults)) { - asyncContext->result = RET_FAILED; - return nullptr; - } + ani_ref aniPerms = ConvertAniArrayString(env, asyncContext->permissionList); + ani_ref aniAuthRes = ConvertAniArrayInt(env, state); + ani_ref aniDiasShownRes = ConvertAniArrayBool(env, asyncContext->dialogShownResults); + ani_ref aniErrorReasons = ConvertAniArrayInt(env, asyncContext->errorReasons); + if (aniPerms == nullptr || aniAuthRes == nullptr || aniDiasShownRes == nullptr || aniErrorReasons == nullptr || + !CallSetter(env, cls, aObject, SETTER_METHOD_NAME(permissions), aniPerms) || + !CallSetter(env, cls, aObject, SETTER_METHOD_NAME(authResults), aniAuthRes) || + !CallSetter(env, cls, aObject, SETTER_METHOD_NAME(dialogShownResults), aniDiasShownRes) || + !CallSetter(env, cls, aObject, SETTER_METHOD_NAME(errorReasons), aniErrorReasons)) { + aObject = nullptr; + } + DeleteReference(env, aniPerms); + DeleteReference(env, aniAuthRes); + DeleteReference(env, aniDiasShownRes); + DeleteReference(env, aniErrorReasons); return aObject; } @@ -1483,4 +1482,4 @@ ANI_EXPORT ani_status ANI_Constructor(ani_vm* vm, uint32_t* result) } } // namespace AccessToken } // namespace Security -} // namespace OHOS \ No newline at end of file +} // namespace OHOS diff --git a/frameworks/ets/ani/common/include/ani_utils.h b/frameworks/ets/ani/common/include/ani_utils.h index f86989e112f4e8e7ad8a4160c188b8497859da97..1a937980b90b123d749335df6920cdea187427f1 100644 --- a/frameworks/ets/ani/common/include/ani_utils.h +++ b/frameworks/ets/ani/common/include/ani_utils.h @@ -54,6 +54,7 @@ bool IsCurrentThread(std::thread::id threadId); bool AniIsCallbackRefEqual(ani_env* env, const ani_ref& compareRef, const ani_ref& targetRref, std::thread::id threadId, bool& isEqual); bool AniFunctionalObjectCall(ani_env *env, const ani_fn_object& fn, ani_size size, ani_ref* argv, ani_ref& result); +void DeleteReference(ani_env* env, ani_ref& ref); } // namespace AccessToken } // namespace Security } // namespace OHOS diff --git a/frameworks/ets/ani/common/src/ani_utils.cpp b/frameworks/ets/ani/common/src/ani_utils.cpp index 22200802f27bfe0a4c9aa552c2f0dff4cf8c14db..0078798b2e10499a2559753e942ac8b0b4fd6b6d 100644 --- a/frameworks/ets/ani/common/src/ani_utils.cpp +++ b/frameworks/ets/ani/common/src/ani_utils.cpp @@ -264,6 +264,14 @@ bool AniFunctionalObjectCall(ani_env *env, const ani_fn_object& fn, ani_size siz } return true; } + +void DeleteReference(ani_env* env, ani_ref& ref) +{ + if (ref != nullptr) { + env->GlobalReference_Delete(ref); + ref = nullptr; + } +} } // namespace AccessToken } // namespace Security } // namespace OHOS