From cdef313af17b838337d07dc07054b9ade9ba204d Mon Sep 17 00:00:00 2001 From: Lukasz Bardeli Date: Thu, 25 Jan 2018 11:53:43 +0100 Subject: [PATCH] [Download] Fix preventing crash. Prevent call callback twice Add condition to prevent call some callback twice and modify body of methods OnFinished, OnCanceled and OnFailed to prevent crash. [Verification] Code compiles without error. TCT passrate 100% Change-Id: I7d194b4d762a52f0281e22555bfd54caa3cb4579 Signed-off-by: Lukasz Bardeli --- src/download/download_instance.cc | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/download/download_instance.cc b/src/download/download_instance.cc index 52923da8..0572376b 100644 --- a/src/download/download_instance.cc +++ b/src/download/download_instance.cc @@ -189,6 +189,14 @@ void DownloadInstance::OnStateChanged(int download_id, download_state_e state, v ScopeLogger(); CallbackPtr downCbPtr = static_cast(user_data); + // Prevent to call finished, cancelled or failed function more than once + if (DOWNLOAD_STATE_COMPLETED == downCbPtr->state || + DOWNLOAD_STATE_CANCELED == downCbPtr->state || + DOWNLOAD_STATE_FAILED == downCbPtr->state) { + LoggerD("Already finished job, not calling callback for %d state", downCbPtr->state); + return; + } + downCbPtr->state = state; downCbPtr->downloadId = download_id; @@ -316,9 +324,8 @@ gboolean DownloadInstance::OnFinished(void* user_data) { out["fullPath"] = picojson::value(common::FilesystemProvider::Create().GetVirtualPath(fullPath)); Instance::PostMessage(downCbPtr->instance, picojson::value(out).serialize().c_str()); - downCbPtr->instance->download_callbacks.erase(callback_id); - delete (downCbPtr); - + // downCbPtr is freed in destructor, it prevent from crash if OnFinished state + // was called after OnCanceled or OnFailed free(fullPath); return FALSE; @@ -386,9 +393,8 @@ gboolean DownloadInstance::OnCanceled(void* user_data) { out["callbackId"] = picojson::value(static_cast(callback_id)); Instance::PostMessage(downCbPtr->instance, picojson::value(out).serialize().c_str()); - downCbPtr->instance->download_callbacks.erase(callback_id); - delete (downCbPtr); - + // downCbPtr is freed in destructor, it prevent from crash if OnFinished state + // was called after OnFinished or OnFailed return FALSE; } @@ -445,9 +451,8 @@ gboolean DownloadInstance::OnFailed(void* user_data) { out["callbackId"] = picojson::value(static_cast(downCbPtr->callbackId)); Instance::PostMessage(downCbPtr->instance, picojson::value(out).serialize().c_str()); - downCbPtr->instance->download_callbacks.erase(callback_id); - delete (downCbPtr); - + // downCbPtr is freed in destructor, it prevent from crash if OnFinished state + // was called after OnFinished or OnCanceled return FALSE; } -- 2.34.1