From 182de6111a03617b834bb8464e7a3eb5d2bd4e61 Mon Sep 17 00:00:00 2001 From: etkmao Date: Thu, 20 Feb 2025 10:54:42 +0800 Subject: [PATCH] fix(ohos): jsvm getInstanceData crash protect --- driver/js/include/driver/napi/jsh/jsh_ctx.h | 2 +- driver/js/src/napi/jsh/jsh_ctx.cc | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/driver/js/include/driver/napi/jsh/jsh_ctx.h b/driver/js/include/driver/napi/jsh/jsh_ctx.h index 1805c862e7e..e09bf52abb8 100644 --- a/driver/js/include/driver/napi/jsh/jsh_ctx.h +++ b/driver/js/include/driver/napi/jsh/jsh_ctx.h @@ -61,7 +61,7 @@ constexpr static int kJSHWeakCallbackWrapperInvalidIndex = 2; constexpr static int KJSHTurboFunctionGetIndex = 3; constexpr static int kJSHExternalDataNum = 4; -extern void* GetPointerInInstanceData(JSVM_Env env, int index); +extern void* GetPointerInInstanceData(JSVM_Env env, int index, bool *error = nullptr); class JSHCtx : public Ctx { public: diff --git a/driver/js/src/napi/jsh/jsh_ctx.cc b/driver/js/src/napi/jsh/jsh_ctx.cc index da3a37e50ff..4a8f3d0f731 100644 --- a/driver/js/src/napi/jsh/jsh_ctx.cc +++ b/driver/js/src/napi/jsh/jsh_ctx.cc @@ -44,7 +44,7 @@ using StringViewUtils = footstone::StringViewUtils; using JSHVM = hippy::vm::JSHVM; using CallbackInfo = hippy::CallbackInfo; -void* GetPointerInInstanceData(JSVM_Env env, int index) { +void* GetPointerInInstanceData(JSVM_Env env, int index, bool *error) { if (index < 0 || index >= kJSHExternalDataNum) { return nullptr; } @@ -53,7 +53,11 @@ void* GetPointerInInstanceData(JSVM_Env env, int index) { auto status = OH_JSVM_GetInstanceData(env, &data); FOOTSTONE_DCHECK(status == JSVM_OK); - if (data) { + if (error) { + *error = (status == JSVM_OK) ? false : true; + } + + if ((status == JSVM_OK) && data) { return ((void**)data)[index]; } return nullptr; @@ -1470,8 +1474,9 @@ void JSH_Finalize(JSVM_Env env, void* finalizeData, void* finalizeHint) { if (!finalizeData) { return; } - void* invalid = GetPointerInInstanceData(env, kJSHWeakCallbackWrapperInvalidIndex); - if (invalid) { + bool error = false; + void* invalid = GetPointerInInstanceData(env, kJSHWeakCallbackWrapperInvalidIndex, &error); + if (invalid || error) { return; } auto wrapper = reinterpret_cast(finalizeData);