From da12bc7de5750447d3a9a0466c80fc6c6f691f39 Mon Sep 17 00:00:00 2001 From: xia-bubai Date: Fri, 4 Jul 2025 14:18:49 +0800 Subject: [PATCH] fix errorReasons Signed-off-by: xia-bubai --- .../accesstoken/src/ability_access_ctrl.cpp | 33 +++++++++---------- frameworks/ets/ani/common/include/ani_utils.h | 1 + frameworks/ets/ani/common/src/ani_utils.cpp | 8 +++++ 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/frameworks/ets/ani/accesstoken/src/ability_access_ctrl.cpp b/frameworks/ets/ani/accesstoken/src/ability_access_ctrl.cpp index b4954d761..73dba25bd 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 f86989e11..1a937980b 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 22200802f..0078798b2 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 -- Gitee