From 6076e317e828c1a316d713113e115e52b88fc74a Mon Sep 17 00:00:00 2001 From: yuwenze Date: Wed, 15 Feb 2023 06:16:14 +0000 Subject: [PATCH] fix wild pointer Signed-off-by: yuwenze Change-Id: I7f8a18c5c443af4724762531300e5793db1b8afc --- .../napi_data_ability_helper.cpp | 210 ++++++++---------- .../featureAbility/napi_data_ability_helper.h | 17 +- .../napi_common/feature_ability_common.h | 34 ++- .../napi_common/js_feature_ability_common.h | 6 - 4 files changed, 126 insertions(+), 141 deletions(-) diff --git a/frameworks/js/napi/featureAbility/napi_data_ability_helper.cpp b/frameworks/js/napi/featureAbility/napi_data_ability_helper.cpp index 16e4c16cd26..1a24f4790f7 100644 --- a/frameworks/js/napi/featureAbility/napi_data_ability_helper.cpp +++ b/frameworks/js/napi/featureAbility/napi_data_ability_helper.cpp @@ -145,25 +145,32 @@ napi_value DataAbilityHelperConstructor(napi_env env, napi_callback_info info) dataAbilityHelper->SetCallFromJs(); g_dataAbilityHelperList.emplace_back(dataAbilityHelper); HILOG_INFO("dataAbilityHelperList.size = %{public}zu", g_dataAbilityHelperList.size()); + auto wrapper = new NAPIDataAbilityHelperWrapper(dataAbilityHelper); napi_wrap( env, thisVar, - dataAbilityHelper.get(), + wrapper, [](napi_env env, void *data, void *hint) { - DataAbilityHelper *objectInfo = static_cast(data); + auto objectInfo = static_cast(data); + if (objectInfo == nullptr) { + HILOG_WARN("DAHelper finalize_cb objectInfo is nullptr."); + return; + } HILOG_INFO("DAHelper finalize_cb regInstances_.size = %{public}zu", g_registerInstances.size()); for (auto iter = g_registerInstances.begin(); iter != g_registerInstances.end();) { - if (!NeedErase(iter, objectInfo)) { + if (!NeedErase(iter, objectInfo->GetDataAbilityHelper())) { iter = g_registerInstances.erase(iter); } } HILOG_INFO("DAHelper finalize_cb regInstances_.size = %{public}zu", g_registerInstances.size()); g_dataAbilityHelperList.remove_if( [objectInfo](const std::shared_ptr &dataAbilityHelper) { - return objectInfo == dataAbilityHelper.get(); + return objectInfo->GetDataAbilityHelper() == dataAbilityHelper; }); HILOG_INFO("DAHelper finalize_cb dataAbilityHelperList.size = %{public}zu", g_dataAbilityHelperList.size()); + delete objectInfo; + objectInfo = nullptr; }, nullptr, nullptr); @@ -240,11 +247,7 @@ napi_value InsertWrap(napi_env env, napi_callback_info info, DAHelperInsertCB *i insertCB->valueBucket.Clear(); AnalysisValuesBucket(insertCB->valueBucket, env, args[PARAM1]); - - DataAbilityHelper *objectInfo = nullptr; - napi_unwrap(env, thisVar, reinterpret_cast(&objectInfo)); - HILOG_INFO("%{public}s,DataAbilityHelper", __func__); - insertCB->dataAbilityHelper = objectInfo; + GetDataAbilityHelper(env, thisVar, insertCB->dataAbilityHelper); if (argcAsync > argcPromise) { ret = InsertAsync(env, args, ARGS_TWO, insertCB); @@ -373,11 +376,16 @@ void InsertExecuteCB(napi_env env, void *data) { HILOG_INFO("NAPI_Insert, worker pool thread execute."); DAHelperInsertCB *insertCB = static_cast(data); - if (insertCB->dataAbilityHelper != nullptr) { + if (insertCB == nullptr) { + HILOG_WARN("NAPI_Insert, insertCB is nullptr."); + return; + } + auto dataAbilityHelper = insertCB->dataAbilityHelper; + if (dataAbilityHelper != nullptr) { insertCB->execResult = INVALID_PARAMETER; if (!insertCB->uri.empty()) { OHOS::Uri uri(insertCB->uri); - insertCB->result = insertCB->dataAbilityHelper->Insert(uri, insertCB->valueBucket); + insertCB->result = dataAbilityHelper->Insert(uri, insertCB->valueBucket); insertCB->execResult = NO_ERROR; } } else { @@ -514,13 +522,8 @@ napi_value NotifyChangeWrap(napi_env env, napi_callback_info info, DAHelperNotif if (valuetype == napi_string) { notifyChangeCB->uri = NapiValueToStringUtf8(env, args[PARAM0]); HILOG_INFO("%{public}s,uri=%{public}s", __func__, notifyChangeCB->uri.c_str()); - } else { - HILOG_ERROR("%{public}s, Wrong argument type.", __func__); } - - DataAbilityHelper *objectInfo = nullptr; - napi_unwrap(env, thisVar, reinterpret_cast(&objectInfo)); - notifyChangeCB->dataAbilityHelper = objectInfo; + GetDataAbilityHelper(env, thisVar, notifyChangeCB->dataAbilityHelper); if (argcAsync > argcPromise) { ret = NotifyChangeAsync(env, args, argcAsync, argcPromise, notifyChangeCB); @@ -591,11 +594,12 @@ void NotifyChangeExecuteCB(napi_env env, void *data) { HILOG_INFO("NAPI_NotifyChange, worker pool thread execute."); DAHelperNotifyChangeCB *notifyChangeCB = static_cast(data); - if (notifyChangeCB->dataAbilityHelper != nullptr) { + auto dataAbilityHelper = notifyChangeCB->dataAbilityHelper; + if (dataAbilityHelper != nullptr) { notifyChangeCB->execResult = INVALID_PARAMETER; if (!notifyChangeCB->uri.empty()) { OHOS::Uri uri(notifyChangeCB->uri); - notifyChangeCB->dataAbilityHelper->NotifyChange(uri); + dataAbilityHelper->NotifyChange(uri); notifyChangeCB->execResult = NO_ERROR; } else { HILOG_ERROR("%{public}s, notifyChangeCB uri is empty.", __func__); @@ -721,11 +725,7 @@ napi_value RegisterWrap(napi_env env, napi_callback_info info, DAHelperOnOffCB * HILOG_ERROR("%{public}s, Wrong argument type.", __func__); onCB->result = INVALID_PARAMETER; } - - DataAbilityHelper *objectInfo = nullptr; - napi_unwrap(env, thisVar, reinterpret_cast(&objectInfo)); - HILOG_INFO("Set DataAbilityHelper objectInfo"); - onCB->dataAbilityHelper = objectInfo; + GetDataAbilityHelper(env, thisVar, onCB->dataAbilityHelper); ret = RegisterAsync(env, args, argcAsync, argcPromise, onCB); return ret; @@ -787,10 +787,11 @@ void RegisterExecuteCB(napi_env env, void *data) return; } - if (onCB->dataAbilityHelper != nullptr) { + auto dataAbilityHelper = onCB->dataAbilityHelper; + if (dataAbilityHelper != nullptr) { if (onCB->result != INVALID_PARAMETER && !onCB->uri.empty() && onCB->cbBase.cbInfo.callback != nullptr) { OHOS::Uri uri(onCB->uri); - onCB->dataAbilityHelper->RegisterObserver(uri, onCB->observer); + dataAbilityHelper->RegisterObserver(uri, onCB->observer); } else { HILOG_ERROR("%{public}s, dataAbilityHelper uri is empty or callback is nullptr.", __func__); } @@ -919,11 +920,7 @@ napi_value UnRegisterWrap(napi_env env, napi_callback_info info, DAHelperOnOffCB offCB->result = INVALID_PARAMETER; } } - - DataAbilityHelper *objectInfo = nullptr; - napi_unwrap(env, thisVar, reinterpret_cast(&objectInfo)); - HILOG_INFO("DataAbilityHelper objectInfo"); - offCB->dataAbilityHelper = objectInfo; + GetDataAbilityHelper(env, thisVar, offCB->dataAbilityHelper); ret = UnRegisterSync(env, offCB); return ret; @@ -947,7 +944,10 @@ napi_value UnRegisterSync(napi_env env, DAHelperOnOffCB *offCB) for (auto &iter : offCB->NotifyList) { if (iter != nullptr && iter->observer != nullptr) { OHOS::Uri uri(iter->uri); - iter->dataAbilityHelper->UnregisterObserver(uri, iter->observer); + auto dataAbilityHelper = iter->dataAbilityHelper; + if (dataAbilityHelper != nullptr) { + dataAbilityHelper->UnregisterObserver(uri, iter->observer); + } offCB->DestroyList.emplace_back(iter); } } @@ -1227,11 +1227,7 @@ napi_value GetTypeWrap(napi_env env, napi_callback_info info, DAHelperGetTypeCB } else { HILOG_ERROR("%{public}s, Wrong argument type.", __func__); } - - DataAbilityHelper *objectInfo = nullptr; - napi_unwrap(env, thisVar, reinterpret_cast(&objectInfo)); - HILOG_INFO("%{public}s,DataAbilityHelper", __func__); - gettypeCB->dataAbilityHelper = objectInfo; + GetDataAbilityHelper(env, thisVar, gettypeCB->dataAbilityHelper); if (argcAsync > argcPromise) { ret = GetTypeAsync(env, args, ARGS_ONE, gettypeCB); @@ -1304,11 +1300,12 @@ void GetTypeExecuteCB(napi_env env, void *data) { HILOG_INFO("NAPI_GetType, worker pool thread execute."); DAHelperGetTypeCB *gettypeCB = static_cast(data); - if (gettypeCB->dataAbilityHelper != nullptr) { + auto dataAbilityHelper = gettypeCB->dataAbilityHelper; + if (dataAbilityHelper != nullptr) { gettypeCB->execResult = INVALID_PARAMETER; if (!gettypeCB->uri.empty()) { OHOS::Uri uri(gettypeCB->uri); - gettypeCB->result = gettypeCB->dataAbilityHelper->GetType(uri); + gettypeCB->result = dataAbilityHelper->GetType(uri); gettypeCB->execResult = NO_ERROR; } else { HILOG_ERROR("NAPI_GetType, dataAbilityHelper uri is empty."); @@ -1409,11 +1406,7 @@ napi_value GetFileTypesWrap(napi_env env, napi_callback_info info, DAHelperGetFi getfiletypesCB->mimeTypeFilter = NapiValueToStringUtf8(env, args[PARAM1]); HILOG_INFO("%{public}s,mimeTypeFilter=%{public}s", __func__, getfiletypesCB->mimeTypeFilter.c_str()); } - - DataAbilityHelper *objectInfo = nullptr; - napi_unwrap(env, thisVar, reinterpret_cast(&objectInfo)); - HILOG_INFO("%{public}s,DataAbilityHelper objectInfo", __func__); - getfiletypesCB->dataAbilityHelper = objectInfo; + GetDataAbilityHelper(env, thisVar, getfiletypesCB->dataAbilityHelper); if (argcAsync > argcPromise) { ret = GetFileTypesAsync(env, args, ARGS_TWO, getfiletypesCB); @@ -1486,15 +1479,14 @@ void GetFileTypesExecuteCB(napi_env env, void *data) { HILOG_INFO("NAPI_GetFileTypes, worker pool thread execute."); DAHelperGetFileTypesCB *getfiletypesCB = static_cast(data); - if (getfiletypesCB->dataAbilityHelper != nullptr) { + auto dataAbilityHelper = getfiletypesCB->dataAbilityHelper; + if (dataAbilityHelper != nullptr) { getfiletypesCB->execResult = INVALID_PARAMETER; if (!getfiletypesCB->uri.empty()) { OHOS::Uri uri(getfiletypesCB->uri); HILOG_INFO("NAPI_GetFileTypes, uri:%{public}s", uri.ToString().c_str()); HILOG_INFO("NAPI_GetFileTypes, mimeTypeFilter:%{public}s", getfiletypesCB->mimeTypeFilter.c_str()); - getfiletypesCB->result = getfiletypesCB->dataAbilityHelper->GetFileTypes( - uri, - getfiletypesCB->mimeTypeFilter); + getfiletypesCB->result = dataAbilityHelper->GetFileTypes(uri, getfiletypesCB->mimeTypeFilter); getfiletypesCB->execResult = NO_ERROR; } else { HILOG_INFO("NAPI_GetFileTypes, dataAbilityHelper uri is empty."); @@ -1611,11 +1603,7 @@ napi_value NormalizeUriWrap(napi_env env, napi_callback_info info, DAHelperNorma normalizeuriCB->uri = NapiValueToStringUtf8(env, args[PARAM0]); HILOG_INFO("%{public}s,uri=%{public}s", __func__, normalizeuriCB->uri.c_str()); } - - DataAbilityHelper *objectInfo = nullptr; - napi_unwrap(env, thisVar, reinterpret_cast(&objectInfo)); - HILOG_INFO("%{public}s,DataAbilityHelper objectInfo", __func__); - normalizeuriCB->dataAbilityHelper = objectInfo; + GetDataAbilityHelper(env, thisVar, normalizeuriCB->dataAbilityHelper); if (argcAsync > argcPromise) { ret = NormalizeUriAsync(env, args, ARGS_ONE, normalizeuriCB); @@ -1689,11 +1677,12 @@ void NormalizeUriExecuteCB(napi_env env, void *data) HILOG_INFO("NAPI_NormalizeUri, worker pool thread execute."); DAHelperNormalizeUriCB *normalizeuriCB = static_cast(data); Uri uriValue(normalizeuriCB->uri); - if (normalizeuriCB->dataAbilityHelper != nullptr) { + auto dataAbilityHelper = normalizeuriCB->dataAbilityHelper; + if (dataAbilityHelper != nullptr) { normalizeuriCB->execResult = INVALID_PARAMETER; if (!normalizeuriCB->uri.empty()) { OHOS::Uri uri(normalizeuriCB->uri); - uriValue = normalizeuriCB->dataAbilityHelper->NormalizeUri(uri); + uriValue = dataAbilityHelper->NormalizeUri(uri); normalizeuriCB->result = uriValue.ToString(); normalizeuriCB->execResult = NO_ERROR; } @@ -1788,11 +1777,7 @@ napi_value DenormalizeUriWrap(napi_env env, napi_callback_info info, DAHelperDen denormalizeuriCB->uri = NapiValueToStringUtf8(env, args[PARAM0]); HILOG_INFO("%{public}s,uri=%{public}s", __func__, denormalizeuriCB->uri.c_str()); } - - DataAbilityHelper *objectInfo = nullptr; - napi_unwrap(env, thisVar, reinterpret_cast(&objectInfo)); - HILOG_INFO("%{public}s,DataAbilityHelper objectInfo", __func__); - denormalizeuriCB->dataAbilityHelper = objectInfo; + GetDataAbilityHelper(env, thisVar, denormalizeuriCB->dataAbilityHelper); if (argcAsync > argcPromise) { ret = DenormalizeUriAsync(env, args, ARGS_ONE, denormalizeuriCB); @@ -1866,11 +1851,12 @@ void DenormalizeUriExecuteCB(napi_env env, void *data) HILOG_INFO("NAPI_DenormalizeUri, worker pool thread execute."); DAHelperDenormalizeUriCB *denormalizeuriCB = static_cast(data); Uri uriValue(denormalizeuriCB->uri); - if (denormalizeuriCB->dataAbilityHelper != nullptr) { + auto dataAbilityHelper = denormalizeuriCB->dataAbilityHelper; + if (dataAbilityHelper != nullptr) { denormalizeuriCB->execResult = INVALID_PARAMETER; if (!denormalizeuriCB->uri.empty()) { OHOS::Uri uri(denormalizeuriCB->uri); - uriValue = denormalizeuriCB->dataAbilityHelper->DenormalizeUri(uri); + uriValue = dataAbilityHelper->DenormalizeUri(uri); denormalizeuriCB->result = uriValue.ToString(); denormalizeuriCB->execResult = NO_ERROR; } else { @@ -1992,10 +1978,7 @@ napi_value DeleteWrap(napi_env env, napi_callback_info info, DAHelperDeleteCB *d } UnwrapDataAbilityPredicates(deleteCB->predicates, env, args[PARAM1]); - DataAbilityHelper *objectInfo = nullptr; - napi_unwrap(env, thisVar, reinterpret_cast(&objectInfo)); - HILOG_INFO("%{public}s,DataAbilityHelper objectInfo", __func__); - deleteCB->dataAbilityHelper = objectInfo; + GetDataAbilityHelper(env, thisVar, deleteCB->dataAbilityHelper); if (argcAsync > argcPromise) { ret = DeleteAsync(env, args, ARGS_TWO, deleteCB); @@ -2068,11 +2051,12 @@ void DeleteExecuteCB(napi_env env, void *data) { HILOG_INFO("NAPI_Delete, worker pool thread execute."); DAHelperDeleteCB *deleteCB = static_cast(data); - if (deleteCB->dataAbilityHelper != nullptr) { + auto dataAbilityHelper = deleteCB->dataAbilityHelper; + if (dataAbilityHelper != nullptr) { deleteCB->execResult = INVALID_PARAMETER; if (!deleteCB->uri.empty()) { OHOS::Uri uri(deleteCB->uri); - deleteCB->result = deleteCB->dataAbilityHelper->Delete(uri, deleteCB->predicates); + deleteCB->result = dataAbilityHelper->Delete(uri, deleteCB->predicates); deleteCB->execResult = NO_ERROR; } else { HILOG_ERROR("NAPI_Delete, dataAbilityHelper uri is empty"); @@ -2182,10 +2166,7 @@ napi_value UpdateWrap(napi_env env, napi_callback_info info, DAHelperUpdateCB *u updateCB->valueBucket.Clear(); AnalysisValuesBucket(updateCB->valueBucket, env, args[PARAM1]); UnwrapDataAbilityPredicates(updateCB->predicates, env, args[PARAM2]); - DataAbilityHelper *objectInfo = nullptr; - napi_unwrap(env, thisVar, reinterpret_cast(&objectInfo)); - HILOG_INFO("%{public}s,DataAbilityHelper objectInfo", __func__); - updateCB->dataAbilityHelper = objectInfo; + GetDataAbilityHelper(env, thisVar, updateCB->dataAbilityHelper); if (argcAsync > argcPromise) { ret = UpdateAsync(env, args, ARGS_THREE, updateCB); @@ -2258,11 +2239,12 @@ void UpdateExecuteCB(napi_env env, void *data) { HILOG_INFO("NAPI_Update, worker pool thread execute."); DAHelperUpdateCB *updateCB = static_cast(data); - if (updateCB->dataAbilityHelper != nullptr) { + auto dataAbilityHelper = updateCB->dataAbilityHelper; + if (dataAbilityHelper != nullptr) { updateCB->execResult = INVALID_PARAMETER; if (!updateCB->uri.empty()) { OHOS::Uri uri(updateCB->uri); - updateCB->result = updateCB->dataAbilityHelper->Update(uri, updateCB->valueBucket, updateCB->predicates); + updateCB->result = dataAbilityHelper->Update(uri, updateCB->valueBucket, updateCB->predicates); updateCB->execResult = NO_ERROR; } else { HILOG_ERROR("NAPI_Update, dataAbilityHelper uri is empty"); @@ -2436,11 +2418,12 @@ void CallExecuteCB(napi_env env, void *data) { HILOG_INFO("CallExecuteCB, worker pool thread execute."); DAHelperCallCB *callCB = static_cast(data); - if (callCB->dataAbilityHelper != nullptr) { + auto dataAbilityHelper = callCB->dataAbilityHelper; + if (dataAbilityHelper != nullptr) { callCB->execResult = INVALID_PARAMETER; if (!callCB->uri.empty()) { OHOS::Uri uri(callCB->uri); - callCB->result = callCB->dataAbilityHelper->Call(uri, callCB->method, callCB->arg, callCB->pacMap); + callCB->result = dataAbilityHelper->Call(uri, callCB->method, callCB->arg, callCB->pacMap); callCB->execResult = NO_ERROR; } } else { @@ -2677,9 +2660,7 @@ napi_value CallWrap(napi_env env, napi_callback_info info, DAHelperCallCB *callC if (valuetype == napi_object) { AnalysisPacMap(callCB->pacMap, env, args[PARAM3]); } - DataAbilityHelper *objectInfo = nullptr; - napi_unwrap(env, thisVar, reinterpret_cast(&objectInfo)); - callCB->dataAbilityHelper = objectInfo; + GetDataAbilityHelper(env, thisVar, callCB->dataAbilityHelper); if (!isPromise) { ret = CallAsync(env, args, ARGS_TWO, callCB); } else { @@ -2788,11 +2769,7 @@ napi_value OpenFileWrap(napi_env env, napi_callback_info info, DAHelperOpenFileC openFileCB->mode = NapiValueToStringUtf8(env, args[PARAM1]); HILOG_INFO("%{public}s,mode=%{public}s", __func__, openFileCB->mode.c_str()); } - - DataAbilityHelper *objectInfo = nullptr; - napi_unwrap(env, thisVar, reinterpret_cast(&objectInfo)); - HILOG_INFO("%{public}s,DataAbilityHelper objectInfo", __func__); - openFileCB->dataAbilityHelper = objectInfo; + GetDataAbilityHelper(env, thisVar, openFileCB->dataAbilityHelper); if (argcAsync > argcPromise) { ret = OpenFileAsync(env, args, ARGS_TWO, openFileCB); @@ -2865,11 +2842,12 @@ void OpenFileExecuteCB(napi_env env, void *data) { HILOG_INFO("NAPI_OpenFile, worker pool thread execute."); DAHelperOpenFileCB *OpenFileCB = static_cast(data); - if (OpenFileCB->dataAbilityHelper != nullptr) { + auto dataAbilityHelper = OpenFileCB->dataAbilityHelper; + if (dataAbilityHelper != nullptr) { OpenFileCB->execResult = INVALID_PARAMETER; if (!OpenFileCB->uri.empty()) { OHOS::Uri uri(OpenFileCB->uri); - OpenFileCB->result = OpenFileCB->dataAbilityHelper->OpenFile(uri, OpenFileCB->mode); + OpenFileCB->result = dataAbilityHelper->OpenFile(uri, OpenFileCB->mode); OpenFileCB->execResult = NO_ERROR; } else { HILOG_ERROR("NAPI_OpenFile, dataAbilityHelper uri is empty"); @@ -3019,11 +2997,7 @@ napi_value BatchInsertWrap(napi_env env, napi_callback_info info, DAHelperBatchI } batchInsertCB->values = NapiValueObject(env, args[PARAM1]); - - DataAbilityHelper *objectInfo = nullptr; - napi_unwrap(env, thisVar, reinterpret_cast(&objectInfo)); - HILOG_INFO("%{public}s,DataAbilityHelper objectInfo", __func__); - batchInsertCB->dataAbilityHelper = objectInfo; + GetDataAbilityHelper(env, thisVar, batchInsertCB->dataAbilityHelper); if (argcAsync > argcPromise) { ret = BatchInsertAsync(env, args, ARGS_TWO, batchInsertCB); @@ -3097,11 +3071,12 @@ void BatchInsertExecuteCB(napi_env env, void *data) { HILOG_INFO("NAPI_BatchInsert, worker pool thread execute."); DAHelperBatchInsertCB *batchInsertCB = static_cast(data); - if (batchInsertCB->dataAbilityHelper != nullptr) { + auto dataAbilityHelper = batchInsertCB->dataAbilityHelper; + if (dataAbilityHelper != nullptr) { batchInsertCB->execResult = INVALID_PARAMETER; if (!batchInsertCB->uri.empty()) { OHOS::Uri uri(batchInsertCB->uri); - batchInsertCB->result = batchInsertCB->dataAbilityHelper->BatchInsert(uri, batchInsertCB->values); + batchInsertCB->result = dataAbilityHelper->BatchInsert(uri, batchInsertCB->values); batchInsertCB->execResult = NO_ERROR; } else { HILOG_ERROR("NAPI_BatchInsert, dataAbilityHelper uri is empyt"); @@ -3219,10 +3194,7 @@ napi_value QueryWrap(napi_env env, napi_callback_info info, DAHelperQueryCB *que } UnwrapDataAbilityPredicates(queryCB->predicates, env, args[PARAM2]); - DataAbilityHelper *objectInfo = nullptr; - napi_unwrap(env, thisVar, reinterpret_cast(&objectInfo)); - HILOG_INFO("%{public}s,DataAbilityHelper objectInfo", __func__); - queryCB->dataAbilityHelper = objectInfo; + GetDataAbilityHelper(env, thisVar, queryCB->dataAbilityHelper); if (argcAsync > argcPromise) { ret = QuerySync(env, args, ARGS_THREE, queryCB); @@ -3247,11 +3219,12 @@ napi_value QuerySync(napi_env env, napi_value *args, const size_t argCallback, D NAPI_CALL(env, napi_create_reference(env, args[argCallback], 1, &queryCB->cbBase.cbInfo.callback)); } - if (queryCB->dataAbilityHelper != nullptr) { + auto dataAbilityHelper = queryCB->dataAbilityHelper; + if (dataAbilityHelper != nullptr) { queryCB->execResult = INVALID_PARAMETER; if (!queryCB->uri.empty()) { OHOS::Uri uri(queryCB->uri); - auto resultset = queryCB->dataAbilityHelper->Query(uri, queryCB->columns, queryCB->predicates); + auto resultset = dataAbilityHelper->Query(uri, queryCB->columns, queryCB->predicates); if (resultset != nullptr) { queryCB->result = resultset; queryCB->execResult = NO_ERROR; @@ -3289,10 +3262,11 @@ napi_value QueryPromise(napi_env env, DAHelperQueryCB *queryCB) return nullptr; } - if (queryCB->dataAbilityHelper != nullptr) { + auto dataAbilityHelper = queryCB->dataAbilityHelper; + if (dataAbilityHelper != nullptr) { if (!queryCB->uri.empty()) { OHOS::Uri uri(queryCB->uri); - auto resultset = queryCB->dataAbilityHelper->Query(uri, queryCB->columns, queryCB->predicates); + auto resultset = dataAbilityHelper->Query(uri, queryCB->columns, queryCB->predicates); if (resultset != nullptr) { queryCB->result = resultset; } @@ -3403,11 +3377,8 @@ napi_value ExecuteBatchWrap(napi_env env, napi_callback_info info, DAHelperExecu UnwrapArrayOperationFromJS(env, info, args[PARAM1], operations); HILOG_INFO("%{public}s,operations size=%{public}zu", __func__, operations.size()); executeBatchCB->operations = operations; - - DataAbilityHelper *objectInfo = nullptr; - napi_unwrap(env, thisVar, reinterpret_cast(&objectInfo)); - HILOG_INFO("%{public}s,DataAbilityHelper objectInfo", __func__); - executeBatchCB->dataAbilityHelper = objectInfo; + GetDataAbilityHelper(env, thisVar, executeBatchCB->dataAbilityHelper); + if (argcAsync > argcPromise) { ret = ExecuteBatchAsync(env, args, argcAsync, argcPromise, executeBatchCB); @@ -3481,9 +3452,10 @@ void ExecuteBatchExecuteCB(napi_env env, void *data) { HILOG_INFO("%{public}s,NAPI_ExecuteBatch, worker pool thread execute start.", __func__); DAHelperExecuteBatchCB *executeBatchCB = static_cast(data); - if (executeBatchCB->dataAbilityHelper != nullptr) { + auto dataAbilityHelper = executeBatchCB->dataAbilityHelper; + if (dataAbilityHelper != nullptr) { OHOS::Uri uri(executeBatchCB->uri); - executeBatchCB->result = executeBatchCB->dataAbilityHelper->ExecuteBatch(uri, executeBatchCB->operations); + executeBatchCB->result = dataAbilityHelper->ExecuteBatch(uri, executeBatchCB->operations); HILOG_INFO("%{public}s, dataAbilityHelper is not nullptr. %{public}zu", __func__, executeBatchCB->result.size()); } @@ -3557,26 +3529,36 @@ void GetDataAbilityResultForResult( HILOG_INFO("%{public}s, NAPI_ExecuteBatch, getDataAbilityResultForResult end.", __func__); } +void GetDataAbilityHelper(napi_env env, napi_value thisVar, std::shared_ptr& dataAbilityHelper) +{ + NAPIDataAbilityHelperWrapper* wrapper = nullptr; + napi_unwrap(env, thisVar, reinterpret_cast(&wrapper)); + if (wrapper != nullptr) { + HILOG_INFO("%{public}s, wrapper is valid.", __func__); + dataAbilityHelper = wrapper->GetDataAbilityHelper(); + } +} + void EraseMemberProperties(DAHelperOnOffCB* onCB) { if (onCB->observer) { HILOG_DEBUG("EraseMemberProperties, call ReleaseJSCallback"); onCB->observer->ReleaseJSCallback(); - onCB->observer = nullptr; } - if (onCB->dataAbilityHelper) { + auto dataAbilityHelper = onCB->dataAbilityHelper; + if (dataAbilityHelper != nullptr) { HILOG_DEBUG("EraseMemberProperties, call Release"); - onCB->dataAbilityHelper->Release(); - onCB->dataAbilityHelper = nullptr; + dataAbilityHelper->Release(); } } -bool NeedErase(std::vector::iterator& iter, const DataAbilityHelper* objectInfo) +bool NeedErase(std::vector::iterator& iter, + const std::shared_ptr&& dataAbilityHelper) { if ((*iter) == nullptr) { return false; } - if ((*iter)->dataAbilityHelper == objectInfo) { + if ((*iter)->dataAbilityHelper == dataAbilityHelper) { EraseMemberProperties(*iter); delete (*iter); (*iter) = nullptr; diff --git a/frameworks/js/napi/featureAbility/napi_data_ability_helper.h b/frameworks/js/napi/featureAbility/napi_data_ability_helper.h index eaa1279537c..c3e0127ec02 100644 --- a/frameworks/js/napi/featureAbility/napi_data_ability_helper.h +++ b/frameworks/js/napi/featureAbility/napi_data_ability_helper.h @@ -39,6 +39,19 @@ private: std::mutex mutex_; }; +class NAPIDataAbilityHelperWrapper { +public: + explicit NAPIDataAbilityHelperWrapper(std::weak_ptr&& dataAbilityHelper) + : dataAbilityHelper_(dataAbilityHelper) {} + inline std::shared_ptr GetDataAbilityHelper() const + { + return dataAbilityHelper_.lock(); + } + +private: + std::weak_ptr dataAbilityHelper_; +}; + /** * @brief DataAbilityHelper NAPI module registration. * @@ -462,8 +475,10 @@ void ExecuteBatchPromiseCompleteCB(napi_env env, napi_status status, void *data) void GetDataAbilityResultForResult( napi_env env, const std::vector> &dataAbilityResult, napi_value result); +void GetDataAbilityHelper(napi_env env, napi_value thisVar, std::shared_ptr& dataAbilityHelper); void DeleteDAHelperOnOffCB(DAHelperOnOffCB *onCB); -bool NeedErase(std::vector::iterator& iter, const DataAbilityHelper* objectInfo); +bool NeedErase(std::vector::iterator& iter, + const std::shared_ptr&& dataAbilityHelper); void EraseMemberProperties(DAHelperOnOffCB* onCB); } // namespace AppExecFwk } // namespace OHOS diff --git a/frameworks/js/napi/inner/napi_common/feature_ability_common.h b/frameworks/js/napi/inner/napi_common/feature_ability_common.h index 111f9146994..8d435074b96 100644 --- a/frameworks/js/napi/inner/napi_common/feature_ability_common.h +++ b/frameworks/js/napi/inner/napi_common/feature_ability_common.h @@ -166,7 +166,7 @@ struct DataAbilityHelperCB { struct DAHelperInsertCB { CBBase cbBase; - DataAbilityHelper *dataAbilityHelper = nullptr; + std::shared_ptr dataAbilityHelper; std::string uri; NativeRdb::ValuesBucket valueBucket; int result = 0; @@ -193,7 +193,7 @@ struct ConnectAbilityCB { struct DAHelperNotifyChangeCB { CBBase cbBase; - DataAbilityHelper *dataAbilityHelper = nullptr; + std::shared_ptr dataAbilityHelper; std::string uri; int execResult; }; @@ -201,7 +201,7 @@ struct DAHelperNotifyChangeCB { class NAPIDataAbilityObserver; struct DAHelperOnOffCB { CBBase cbBase; - DataAbilityHelper *dataAbilityHelper = nullptr; + std::shared_ptr dataAbilityHelper; sptr observer; std::string uri; int result = 0; @@ -232,7 +232,7 @@ static inline bool NapiValueToArrayStringUtf8(napi_env env, napi_value param, st struct DAHelperGetTypeCB { CBBase cbBase; - DataAbilityHelper *dataAbilityHelper = nullptr; + std::shared_ptr dataAbilityHelper; std::string uri; std::string result = ""; int execResult; @@ -240,7 +240,7 @@ struct DAHelperGetTypeCB { struct DAHelperGetFileTypesCB { CBBase cbBase; - DataAbilityHelper *dataAbilityHelper = nullptr; + std::shared_ptr dataAbilityHelper; std::string uri; std::string mimeTypeFilter; std::vector result; @@ -249,14 +249,14 @@ struct DAHelperGetFileTypesCB { struct DAHelperNormalizeUriCB { CBBase cbBase; - DataAbilityHelper *dataAbilityHelper = nullptr; + std::shared_ptr dataAbilityHelper; std::string uri; std::string result = ""; int execResult; }; struct DAHelperDenormalizeUriCB { CBBase cbBase; - DataAbilityHelper *dataAbilityHelper = nullptr; + std::shared_ptr dataAbilityHelper; std::string uri; std::string result = ""; int execResult; @@ -264,7 +264,7 @@ struct DAHelperDenormalizeUriCB { struct DAHelperDeleteCB { CBBase cbBase; - DataAbilityHelper *dataAbilityHelper = nullptr; + std::shared_ptr dataAbilityHelper; std::string uri; NativeRdb::DataAbilityPredicates predicates; int result = 0; @@ -273,7 +273,7 @@ struct DAHelperDeleteCB { struct DAHelperQueryCB { CBBase cbBase; - DataAbilityHelper *dataAbilityHelper = nullptr; + std::shared_ptr dataAbilityHelper; std::string uri; std::vector columns; NativeRdb::DataAbilityPredicates predicates; @@ -283,7 +283,7 @@ struct DAHelperQueryCB { struct DAHelperUpdateCB { CBBase cbBase; - DataAbilityHelper *dataAbilityHelper = nullptr; + std::shared_ptr dataAbilityHelper; std::string uri; NativeRdb::ValuesBucket valueBucket; NativeRdb::DataAbilityPredicates predicates; @@ -293,7 +293,7 @@ struct DAHelperUpdateCB { struct DAHelperCallCB { CBBase cbBase; - DataAbilityHelper *dataAbilityHelper = nullptr; + std::shared_ptr dataAbilityHelper; std::string uri; std::string method; std::string arg; @@ -308,7 +308,7 @@ struct DAHelperErrorCB { }; struct DAHelperBatchInsertCB { CBBase cbBase; - DataAbilityHelper *dataAbilityHelper = nullptr; + std::shared_ptr dataAbilityHelper; std::string uri; std::vector values; int result = 0; @@ -316,24 +316,18 @@ struct DAHelperBatchInsertCB { }; struct DAHelperOpenFileCB { CBBase cbBase; - DataAbilityHelper *dataAbilityHelper = nullptr; + std::shared_ptr dataAbilityHelper; std::string uri; std::string mode; int result = 0; int execResult; }; -struct DAHelperReleaseCB { - CBBase cbBase; - DataAbilityHelper *dataAbilityHelper = nullptr; - bool result = false; -}; - struct DAHelperExecuteBatchCB { CBBase cbBase; std::string uri; std::vector> operations; - DataAbilityHelper *dataAbilityHelper = nullptr; + std::shared_ptr dataAbilityHelper; std::vector> result; }; } // namespace AppExecFwk diff --git a/frameworks/js/napi/inner/napi_common/js_feature_ability_common.h b/frameworks/js/napi/inner/napi_common/js_feature_ability_common.h index b1856e17975..0e4cded4d70 100644 --- a/frameworks/js/napi/inner/napi_common/js_feature_ability_common.h +++ b/frameworks/js/napi/inner/napi_common/js_feature_ability_common.h @@ -208,12 +208,6 @@ struct DAHelperOpenFileCB { int execResult; }; -struct DAHelperReleaseCB { - CBBase cbBase; - DataAbilityHelper *dataAbilityHelper = nullptr; - bool result = false; -}; - struct DAHelperExecuteBatchCB { CBBase cbBase; std::string uri; -- Gitee