[Messaging] Prevent crash of using released structure mail_data_final
[platform/core/api/webapi-plugins.git] / src / messaging / email_manager.cc
index 653840b..8b1c905 100644 (file)
@@ -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);
     }