diff --git a/ani/settings/ani_settings.cpp b/ani/settings/ani_settings.cpp index e518624dee8a90f626e5d6cfbd193d373adea7f9..c372cecc7570b63ca6366518f4b5770ecfb7829f 100644 --- a/ani/settings/ani_settings.cpp +++ b/ani/settings/ani_settings.cpp @@ -207,6 +207,8 @@ ani_string ani_get_value_ext(ani_env *env, ani_object context, ani_string name, asyncCallbackInfo->tableName = unwrap_string_from_js(env, domainName); if (IsTableNameInvalid(asyncCallbackInfo->tableName)) { SETTING_LOG_ERROR("INVALID tableName [ARGS_THREE]"); + delete asyncCallbackInfo; + asyncCallbackInfo = nullptr; return nullptr; } GetValueExecuteExt(env, (void *)asyncCallbackInfo); @@ -250,6 +252,8 @@ ani_boolean ani_set_value_ext( asyncCallbackInfo->value = unwrap_string_from_js(env, value); if (IsTableNameInvalid(asyncCallbackInfo->tableName)) { SETTING_LOG_ERROR("INVALID tableName [ARGS_FOUR]"); + delete asyncCallbackInfo; + asyncCallbackInfo = nullptr; return false; } SetValueExecuteExt(env, (void *)asyncCallbackInfo, asyncCallbackInfo->uri); @@ -479,8 +483,9 @@ ani_boolean ani_set_value_sync_ext( asyncCallbackInfo->dataShareHelper = getDataShareHelper(env, context, asyncCallbackInfo->tableName, asyncCallbackInfo); SetValueExecuteExt(env, (void *)asyncCallbackInfo, unwrap_string_from_js(env, value)); + bool result = ThrowError(env, asyncCallbackInfo->status); DeleteCallbackInfo(asyncCallbackInfo); - return ThrowError(env, asyncCallbackInfo->status); + return static_cast(result); } void SetValueExecuteExt(ani_env *env, void *data, const std::string setValue) diff --git a/ani/settings/ani_settings_observer.cpp b/ani/settings/ani_settings_observer.cpp index 1eb248388d6159e2db5b1e5222180f1fa3c5d5c4..0c791f3438b8c7aaf98588a93f26289c5fa06f9a 100644 --- a/ani/settings/ani_settings_observer.cpp +++ b/ani/settings/ani_settings_observer.cpp @@ -223,6 +223,14 @@ std::string GetObserverIdStr() return tmpIdStr; } +void DeleteAsyncCallbackInfo(AsyncCallbackInfo *asyncCallbackInfo) +{ + if (asyncCallbackInfo != nullptr) { + delete asyncCallbackInfo; + asyncCallbackInfo = nullptr; + } +} + ani_boolean ani_settings_register_observer( ani_env *env, ani_object context, ani_string name, ani_string domainName, ani_object observer) { @@ -244,6 +252,7 @@ ani_boolean ani_settings_register_observer( ani_vm *vm = nullptr; if (env->GetVM(&vm) != ANI_OK) { SETTING_LOG_ERROR("GetVM failed"); + DeleteAsyncCallbackInfo(callbackInfo); return false; } callbackInfo->key = unwrap_string_from_js(env, name); @@ -254,14 +263,14 @@ ani_boolean ani_settings_register_observer( if (g_observerMap.find(callbackInfo->key) != g_observerMap.end() && g_observerMap[callbackInfo->key] != nullptr) { SETTING_LOG_INFO("%{public}s, already registered.", __func__); env->GlobalReference_Delete(callbackInfo->callbackRef); - delete callbackInfo; + DeleteAsyncCallbackInfo(callbackInfo); return false; } auto dataShareHelper = getDataShareHelper(env, context, callbackInfo->tableName); if (dataShareHelper == nullptr) { env->GlobalReference_Delete(callbackInfo->callbackRef); - delete callbackInfo; + DeleteAsyncCallbackInfo(callbackInfo); return false; } @@ -269,15 +278,14 @@ ani_boolean ani_settings_register_observer( OHOS::Uri uri(strUri); sptr settingsObserver = sptr(new (std::nothrow) SettingsObserver(vm, observer, callbackInfo)); - env->GlobalReference_Create(observer, &(settingsObserver->callback_)); + if (settingsObserver->callback_ != nullptr) { + env->GlobalReference_Create(observer, &(settingsObserver->callback_)); + } g_observerMap[callbackInfo->key] = settingsObserver; dataShareHelper->RegisterObserver(uri, settingsObserver); dataShareHelper->Release(); - if (callbackInfo != nullptr) { - delete callbackInfo; - callbackInfo = nullptr; - } + DeleteAsyncCallbackInfo(callbackInfo); return true; }