From: Piotr Kosko/Tizen API (PLT) /SRPOL/Engineer/Samsung Electronics Date: Fri, 24 Dec 2021 09:38:57 +0000 (+0100) Subject: [Messaging] Prevent crash of using released structure mail_data_final X-Git-Tag: accepted/tizen/6.0/unified/20230621.004736~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b952458182dc8700b56d3fbb2ad4f42c06ae563a;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [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 --- diff --git a/src/messaging/email_manager.cc b/src/messaging/email_manager.cc index 653840b..8b1c905 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); }