From 471016b01bd793304c6047835e02fa86d29a6e4e 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