From a23ea715c4ec5f3945e3949b8fa59207271a64e4 Mon Sep 17 00:00:00 2001 From: zhaoyuan17 Date: Tue, 16 Nov 2021 18:02:37 +0000 Subject: [PATCH 1/3] Fix memory leak Signed-off-by: zhaoyuan17 --- interfaces/kits/napi/ans/src/subscribe.cpp | 89 +++++++++++++++++-- .../kits/napi/wantagent/napi_want_agent.cpp | 1 + 2 files changed, 84 insertions(+), 6 deletions(-) diff --git a/interfaces/kits/napi/ans/src/subscribe.cpp b/interfaces/kits/napi/ans/src/subscribe.cpp index db783a021..89b6f77f3 100644 --- a/interfaces/kits/napi/ans/src/subscribe.cpp +++ b/interfaces/kits/napi/ans/src/subscribe.cpp @@ -153,6 +153,8 @@ void UvQueueWorkOnCanceled(uv_work_t *work, int status) NotificationReceiveDataWorker *dataWorkerData = (NotificationReceiveDataWorker *)work->data; if (dataWorkerData == nullptr) { ANS_LOGE("dataWorkerData is null"); + delete work; + work = nullptr; return; } napi_value result = nullptr; @@ -218,15 +220,24 @@ void SubscriberInstance::OnCanceled(const std::shared_ptrdata = (void *)dataWorker; - uv_queue_work(loop, + int ret = uv_queue_work(loop, work, [](uv_work_t *work) {}, UvQueueWorkOnCanceled); + + if (ret != 0) { + delete dataWorker; + dataWorker = nullptr; + delete work; + work = nullptr; + } } void SubscriberInstance::OnConsumed(const std::shared_ptr &request) @@ -244,6 +255,8 @@ void UvQueueWorkOnConsumed(uv_work_t *work, int status) NotificationReceiveDataWorker *dataWorkerData = (NotificationReceiveDataWorker *)work->data; if (dataWorkerData == nullptr) { ANS_LOGE("dataWorkerData is null"); + delete work; + work = nullptr; return; } napi_value result = nullptr; @@ -307,15 +320,23 @@ void SubscriberInstance::OnConsumed(const std::shared_ptrdata = (void *)dataWorker; - uv_queue_work(loop, + int ret = uv_queue_work(loop, work, [](uv_work_t *work) {}, UvQueueWorkOnConsumed); + if (ret != 0) { + delete dataWorker; + dataWorker = nullptr; + delete work; + work = nullptr; + } } void UvQueueWorkOnUpdate(uv_work_t *work, int status) @@ -330,6 +351,8 @@ void UvQueueWorkOnUpdate(uv_work_t *work, int status) NotificationReceiveDataWorker *dataWorkerData = (NotificationReceiveDataWorker *)work->data; if (dataWorkerData == nullptr) { ANS_LOGE("dataWorkerData is null"); + delete work; + work = nullptr; return; } napi_value result = nullptr; @@ -381,15 +404,23 @@ void SubscriberInstance::OnUpdate(const std::shared_ptr uv_work_t *work = new (std::nothrow) uv_work_t; if (work == nullptr) { ANS_LOGE("new work failed"); + delete dataWorker; + dataWorker = nullptr; return; } work->data = (void *)dataWorker; - uv_queue_work(loop, + int ret = uv_queue_work(loop, work, [](uv_work_t *work) {}, UvQueueWorkOnUpdate); + if (ret != 0) { + delete dataWorker; + dataWorker = nullptr; + delete work; + work = nullptr; + } } void SubscriberInstance::OnConnected() @@ -420,12 +451,14 @@ void SubscriberInstance::OnConnected() uv_work_t *work = new (std::nothrow) uv_work_t; if (work == nullptr) { ANS_LOGE("new work failed"); + delete dataWorker; + dataWorker = nullptr; return; } work->data = (void *)dataWorker; - uv_queue_work(loop, + int ret = uv_queue_work(loop, work, [](uv_work_t *work) {}, [](uv_work_t *work, int status) { @@ -439,6 +472,8 @@ void SubscriberInstance::OnConnected() NotificationReceiveDataWorker *dataWorkerData = (NotificationReceiveDataWorker *)work->data; if (dataWorkerData == nullptr) { ANS_LOGE("dataWorkerData is null"); + delete work; + work = nullptr; return; } @@ -449,6 +484,12 @@ void SubscriberInstance::OnConnected() delete work; work = nullptr; }); + if (ret != 0) { + delete dataWorker; + dataWorker = nullptr; + delete work; + work = nullptr; + } } void SubscriberInstance::OnDisconnected() @@ -480,12 +521,14 @@ void SubscriberInstance::OnDisconnected() uv_work_t *work = new (std::nothrow) uv_work_t; if (work == nullptr) { ANS_LOGE("new work failed"); + delete dataWorker; + dataWorker = nullptr; return; } work->data = (void *)dataWorker; - uv_queue_work(loop, + int ret = uv_queue_work(loop, work, [](uv_work_t *work) {}, [](uv_work_t *work, int status) { @@ -499,6 +542,8 @@ void SubscriberInstance::OnDisconnected() NotificationReceiveDataWorker *dataWorkerData = (NotificationReceiveDataWorker *)work->data; if (dataWorkerData == nullptr) { ANS_LOGE("dataWorkerData is null"); + delete work; + work = nullptr; return; } @@ -511,6 +556,12 @@ void SubscriberInstance::OnDisconnected() delete work; work = nullptr; }); + if (ret != 0) { + delete dataWorker; + dataWorker = nullptr; + delete work; + work = nullptr; + } } void SubscriberInstance::OnDied() @@ -541,12 +592,14 @@ void SubscriberInstance::OnDied() uv_work_t *work = new (std::nothrow) uv_work_t; if (work == nullptr) { ANS_LOGE("new work failed"); + delete dataWorker; + dataWorker = nullptr; return; } work->data = (void *)dataWorker; - uv_queue_work(loop, + int ret = uv_queue_work(loop, work, [](uv_work_t *work) {}, [](uv_work_t *work, int status) { @@ -560,6 +613,8 @@ void SubscriberInstance::OnDied() NotificationReceiveDataWorker *dataWorkerData = (NotificationReceiveDataWorker *)work->data; if (dataWorkerData == nullptr) { ANS_LOGE("dataWorkerData is null"); + delete work; + work = nullptr; return; } @@ -571,6 +626,12 @@ void SubscriberInstance::OnDied() delete work; work = nullptr; }); + if (ret != 0) { + delete dataWorker; + dataWorker = nullptr; + delete work; + work = nullptr; + } } void SubscriberInstance::OnDisturbModeChanged(int disturbMode) @@ -813,10 +874,18 @@ napi_value ParseParameters(const napi_env &env, const napi_callback_info &info, if (!HasNotificationSubscriber(env, argv[0], subscriberInstancesInfo)) { if (GetNotificationSubscriber(env, argv[0], subscriberInstancesInfo) == nullptr) { ANS_LOGE("NotificationSubscriber parse failed"); + if (subscriberInstancesInfo.subscriber) { + delete subscriberInstancesInfo.subscriber; + subscriberInstancesInfo.subscriber = nullptr; + } return nullptr; } if (!AddSubscriberInstancesInfo(env, subscriberInstancesInfo)) { ANS_LOGE("AddSubscriberInstancesInfo add failed"); + if (subscriberInstancesInfo.subscriber) { + delete subscriberInstancesInfo.subscriber; + subscriberInstancesInfo.subscriber = nullptr; + } return nullptr; } } @@ -856,6 +925,10 @@ napi_value Subscribe(napi_env env, napi_callback_info info) SubscriberInstance *objectInfo = nullptr; NotificationSubscribeInfo subscriberInfo; if (ParseParameters(env, info, subscriberInfo, objectInfo, callback) == nullptr) { + if (objectInfo) { + delete objectInfo; + objectInfo = nullptr; + } return Common::NapiGetUndefined(env); } ANS_LOGI("Subscribe objectInfo = %{public}p", objectInfo); @@ -864,6 +937,10 @@ napi_value Subscribe(napi_env env, napi_callback_info info) .env = env, .asyncWork = nullptr, .objectInfo = objectInfo, .subscriberInfo = subscriberInfo }; if (!asynccallbackinfo) { + if (objectInfo) { + delete objectInfo; + objectInfo = nullptr; + } return Common::JSParaError(env, callback); } napi_value promise = nullptr; diff --git a/interfaces/kits/napi/wantagent/napi_want_agent.cpp b/interfaces/kits/napi/wantagent/napi_want_agent.cpp index 23b150475..4cb4152c6 100644 --- a/interfaces/kits/napi/wantagent/napi_want_agent.cpp +++ b/interfaces/kits/napi/wantagent/napi_want_agent.cpp @@ -57,6 +57,7 @@ auto OnSendFinishedUvAfterWorkCallback = [](uv_work_t *work, int status) { TriggerReceiveDataWorker *dataWorkerData = static_cast(work->data); if (dataWorkerData == nullptr) { HILOG_INFO("TriggerReceiveDataWorker instance(uv_work_t) is nullptr"); + delete work; return; } napi_value result[NUMBER_OF_PARAMETERS_TWO] = {0}; -- Gitee From 1fb569c0089e96998c782659f774dc46a0a8d671 Mon Sep 17 00:00:00 2001 From: zhaoyuan17 Date: Tue, 16 Nov 2021 18:42:26 +0000 Subject: [PATCH 2/3] Fix codex Signed-off-by: zhaoyuan17 --- interfaces/kits/napi/ans/src/subscribe.cpp | 175 ++++++++++----------- 1 file changed, 81 insertions(+), 94 deletions(-) diff --git a/interfaces/kits/napi/ans/src/subscribe.cpp b/interfaces/kits/napi/ans/src/subscribe.cpp index 89b6f77f3..a2e1683bb 100644 --- a/interfaces/kits/napi/ans/src/subscribe.cpp +++ b/interfaces/kits/napi/ans/src/subscribe.cpp @@ -227,11 +227,7 @@ void SubscriberInstance::OnCanceled(const std::shared_ptrdata = (void *)dataWorker; - int ret = uv_queue_work(loop, - work, - [](uv_work_t *work) {}, - UvQueueWorkOnCanceled); - + int ret = uv_queue_work(loop, work, [](uv_work_t *work) {}, UvQueueWorkOnCanceled); if (ret != 0) { delete dataWorker; dataWorker = nullptr; @@ -327,10 +323,7 @@ void SubscriberInstance::OnConsumed(const std::shared_ptrdata = (void *)dataWorker; - int ret = uv_queue_work(loop, - work, - [](uv_work_t *work) {}, - UvQueueWorkOnConsumed); + int ret = uv_queue_work(loop, work, [](uv_work_t *work) {}, UvQueueWorkOnConsumed); if (ret != 0) { delete dataWorker; dataWorker = nullptr; @@ -411,10 +404,7 @@ void SubscriberInstance::OnUpdate(const std::shared_ptr work->data = (void *)dataWorker; - int ret = uv_queue_work(loop, - work, - [](uv_work_t *work) {}, - UvQueueWorkOnUpdate); + int ret = uv_queue_work(loop, work, [](uv_work_t *work) {}, UvQueueWorkOnUpdate); if (ret != 0) { delete dataWorker; dataWorker = nullptr; @@ -423,6 +413,30 @@ void SubscriberInstance::OnUpdate(const std::shared_ptr } } +void UvQueueWorkOnConnected(uv_work_t *work, int status) { + ANS_LOGI("OnConnected uv_work_t start"); + + if (work == nullptr) { + ANS_LOGE("work is null"); + return; + } + + NotificationReceiveDataWorker *dataWorkerData = (NotificationReceiveDataWorker *)work->data; + if (dataWorkerData == nullptr) { + ANS_LOGE("dataWorkerData is null"); + delete work; + work = nullptr; + return; + } + + Common::SetCallback(dataWorkerData->env, dataWorkerData->ref, Common::NapiGetNull(dataWorkerData->env)); + + delete dataWorkerData; + dataWorkerData = nullptr; + delete work; + work = nullptr; +} + void SubscriberInstance::OnConnected() { ANS_LOGI("enter"); @@ -458,32 +472,7 @@ void SubscriberInstance::OnConnected() work->data = (void *)dataWorker; - int ret = uv_queue_work(loop, - work, - [](uv_work_t *work) {}, - [](uv_work_t *work, int status) { - ANS_LOGI("OnSubscribeResult uv_work_t start"); - - if (work == nullptr) { - ANS_LOGE("work is null"); - return; - } - - NotificationReceiveDataWorker *dataWorkerData = (NotificationReceiveDataWorker *)work->data; - if (dataWorkerData == nullptr) { - ANS_LOGE("dataWorkerData is null"); - delete work; - work = nullptr; - return; - } - - Common::SetCallback(dataWorkerData->env, dataWorkerData->ref, Common::NapiGetNull(dataWorkerData->env)); - - delete dataWorkerData; - dataWorkerData = nullptr; - delete work; - work = nullptr; - }); + int ret = uv_queue_work(loop, work, [](uv_work_t *work) {}, UvQueueWorkOnConnected); if (ret != 0) { delete dataWorker; dataWorker = nullptr; @@ -492,6 +481,32 @@ void SubscriberInstance::OnConnected() } } +void UvQueueWorkOnDisconnected(uv_work_t *work, int status) { + ANS_LOGI("OnDisconnected uv_work_t start"); + + if (work == nullptr) { + ANS_LOGE("work is null"); + return; + } + + NotificationReceiveDataWorker *dataWorkerData = (NotificationReceiveDataWorker *)work->data; + if (dataWorkerData == nullptr) { + ANS_LOGE("dataWorkerData is null"); + delete work; + work = nullptr; + return; + } + + Common::SetCallback(dataWorkerData->env, dataWorkerData->ref, Common::NapiGetNull(dataWorkerData->env)); + + DelSubscriberInstancesInfo(dataWorkerData->env, dataWorkerData->subscriber); + + delete dataWorkerData; + dataWorkerData = nullptr; + delete work; + work = nullptr; +} + void SubscriberInstance::OnDisconnected() { ANS_LOGI("enter"); @@ -528,34 +543,7 @@ void SubscriberInstance::OnDisconnected() work->data = (void *)dataWorker; - int ret = uv_queue_work(loop, - work, - [](uv_work_t *work) {}, - [](uv_work_t *work, int status) { - ANS_LOGI("OnUnsubscribeResult uv_work_t start"); - - if (work == nullptr) { - ANS_LOGE("work is null"); - return; - } - - NotificationReceiveDataWorker *dataWorkerData = (NotificationReceiveDataWorker *)work->data; - if (dataWorkerData == nullptr) { - ANS_LOGE("dataWorkerData is null"); - delete work; - work = nullptr; - return; - } - - Common::SetCallback(dataWorkerData->env, dataWorkerData->ref, Common::NapiGetNull(dataWorkerData->env)); - - DelSubscriberInstancesInfo(dataWorkerData->env, dataWorkerData->subscriber); - - delete dataWorkerData; - dataWorkerData = nullptr; - delete work; - work = nullptr; - }); + int ret = uv_queue_work(loop, work, [](uv_work_t *work) {}, UvQueueWorkOnDisconnected); if (ret != 0) { delete dataWorker; dataWorker = nullptr; @@ -564,6 +552,31 @@ void SubscriberInstance::OnDisconnected() } } +void UvQueueWorkOnDied(uv_work_t *work, int status) { + ANS_LOGI("OnDied uv_work_t start"); + + if (work == nullptr) { + ANS_LOGE("work is null"); + return; + } + + NotificationReceiveDataWorker *dataWorkerData = (NotificationReceiveDataWorker *)work->data; + if (dataWorkerData == nullptr) { + ANS_LOGE("dataWorkerData is null"); + delete work; + work = nullptr; + return; + } + + Common::SetCallback( + dataWorkerData->env, dataWorkerData->ref, Common::NapiGetNull(dataWorkerData->env)); + + delete dataWorkerData; + dataWorkerData = nullptr; + delete work; + work = nullptr; +} + void SubscriberInstance::OnDied() { ANS_LOGI("enter"); @@ -599,33 +612,7 @@ void SubscriberInstance::OnDied() work->data = (void *)dataWorker; - int ret = uv_queue_work(loop, - work, - [](uv_work_t *work) {}, - [](uv_work_t *work, int status) { - ANS_LOGI("OnDied uv_work_t start"); - - if (work == nullptr) { - ANS_LOGE("work is null"); - return; - } - - NotificationReceiveDataWorker *dataWorkerData = (NotificationReceiveDataWorker *)work->data; - if (dataWorkerData == nullptr) { - ANS_LOGE("dataWorkerData is null"); - delete work; - work = nullptr; - return; - } - - Common::SetCallback( - dataWorkerData->env, dataWorkerData->ref, Common::NapiGetNull(dataWorkerData->env)); - - delete dataWorkerData; - dataWorkerData = nullptr; - delete work; - work = nullptr; - }); + int ret = uv_queue_work(loop, work, [](uv_work_t *work) {}, UvQueueWorkOnDied); if (ret != 0) { delete dataWorker; dataWorker = nullptr; -- Gitee From f65990f1ea5942d0341563a445ebe423aa2ee707 Mon Sep 17 00:00:00 2001 From: zhaoyuan17 Date: Tue, 16 Nov 2021 19:05:53 +0000 Subject: [PATCH 3/3] Fix codex Signed-off-by: zhaoyuan17 --- interfaces/kits/napi/ans/src/subscribe.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/interfaces/kits/napi/ans/src/subscribe.cpp b/interfaces/kits/napi/ans/src/subscribe.cpp index a2e1683bb..7899380af 100644 --- a/interfaces/kits/napi/ans/src/subscribe.cpp +++ b/interfaces/kits/napi/ans/src/subscribe.cpp @@ -413,7 +413,8 @@ void SubscriberInstance::OnUpdate(const std::shared_ptr } } -void UvQueueWorkOnConnected(uv_work_t *work, int status) { +void UvQueueWorkOnConnected(uv_work_t *work, int status) +{ ANS_LOGI("OnConnected uv_work_t start"); if (work == nullptr) { @@ -481,7 +482,8 @@ void SubscriberInstance::OnConnected() } } -void UvQueueWorkOnDisconnected(uv_work_t *work, int status) { +void UvQueueWorkOnDisconnected(uv_work_t *work, int status) +{ ANS_LOGI("OnDisconnected uv_work_t start"); if (work == nullptr) { @@ -552,7 +554,8 @@ void SubscriberInstance::OnDisconnected() } } -void UvQueueWorkOnDied(uv_work_t *work, int status) { +void UvQueueWorkOnDied(uv_work_t *work, int status) +{ ANS_LOGI("OnDied uv_work_t start"); if (work == nullptr) { -- Gitee