From 97331380f399a38e1e7857e5e26a11f0bbce75c1 Mon Sep 17 00:00:00 2001 From: "Piotr Kosko/Tizen API (PLT) /SRPOL/Engineer/Samsung Electronics" Date: Fri, 24 Dec 2021 10:38:57 +0100 Subject: [PATCH] [Messaging] Prevent crash of using released structure mail_data_final In line 296, there is the usage: mail_data_final->thread_id = mail_data_final->mail_id; but if retries loop above reaches limit, then the structure is relased, so using it causes crash. To prevent it, we release data on the beginning of the next iteration of a loop. [Verification] TCT passrate: messaging-email - 100%. Change-Id: I4751e5509271f28ab803e0ef10a90ff10d61ec10 --- src/messaging/email_manager.cc | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/messaging/email_manager.cc b/src/messaging/email_manager.cc index 653840b6..8b1c9052 100644 --- a/src/messaging/email_manager.cc +++ b/src/messaging/email_manager.cc @@ -263,6 +263,16 @@ PlatformResult EmailManager::addMessagePlatform(int account_id, std::shared_ptr< int retry = 0; const int MAX_RETRIES = 5; for (; retry < MAX_RETRIES; ++retry) { + // mail_data_final from last retry was not yet released, release it now + // and retry gathering data once again + if (mail_data_final) { + int free_error = email_free_mail_data(&mail_data_final, 1); + if (EMAIL_ERROR_NONE != free_error) { + LoggerW("email_free_mail_data error: %d, %s", free_error, + get_error_message(free_error)); + } + } + err = email_get_mail_data(message->getId(), &mail_data_final); if (EMAIL_ERROR_NONE != err) { @@ -279,11 +289,6 @@ PlatformResult EmailManager::addMessagePlatform(int account_id, std::shared_ptr< LoggerD("Message adding process finished after %d retries. mail_id == thread_id", retry); break; } - - int free_error = email_free_mail_data(&mail_data_final, 1); - if (EMAIL_ERROR_NONE != free_error) { - LoggerW("email_free_mail_data error: %d, %s", free_error, get_error_message(free_error)); - } LoggerD("Retry number %d failed", retry); std::this_thread::sleep_for(100ms); } -- 2.34.1