[evolution-ews] Check validity of returned values in 'Folder Sizes' function



commit 4eaf3eee58ef3e4099a8ec45962368f2102dc1f5
Author: Milan Crha <mcrha redhat com>
Date:   Mon Feb 12 12:51:42 2018 +0100

    Check validity of returned values in 'Folder Sizes' function
    
    It could happen that the server returned an error instead of a folder
    information, which then led to a crash in this code part.
    
    This had been reported downstream at:
    https://bugzilla.redhat.com/show_bug.cgi?id=1544296

 src/configuration/e-ews-config-utils.c |   11 +++++++++--
 src/server/e-ews-folder.c              |    2 +-
 src/server/e-ews-folder.h              |    2 +-
 3 files changed, 11 insertions(+), 4 deletions(-)
---
diff --git a/src/configuration/e-ews-config-utils.c b/src/configuration/e-ews-config-utils.c
index 4a7fbea..c303784 100644
--- a/src/configuration/e-ews-config-utils.c
+++ b/src/configuration/e-ews-config-utils.c
@@ -689,14 +689,21 @@ ews_settings_get_folder_sizes_thread (gpointer user_data)
                                fsd->cancellable, &fsd->error);
 
                for (l = folders_list; l != NULL; l = l->next) {
+                       const EEwsFolder *folder = l->data;
                        const EwsFolderId *folder_id;
                        gchar *folder_full_name;
                        gchar *folder_size;
 
-                       folder_id = e_ews_folder_get_id (l->data);
+                       if (!folder || e_ews_folder_is_error (folder))
+                               continue;
+
+                       folder_id = e_ews_folder_get_id (folder);
+                       if (!folder_id)
+                               continue;
+
                        folder_full_name = camel_ews_store_summary_get_folder_full_name (
                                fsd->ews_store->summary, folder_id->id, NULL);
-                       folder_size = g_format_size (e_ews_folder_get_size (l->data));
+                       folder_size = g_format_size (e_ews_folder_get_size (folder));
 
                        g_hash_table_insert (fsd->folder_sizes, folder_full_name, folder_size);
                }
diff --git a/src/server/e-ews-folder.c b/src/server/e-ews-folder.c
index 0c5a99b..a80f845 100644
--- a/src/server/e-ews-folder.c
+++ b/src/server/e-ews-folder.c
@@ -297,7 +297,7 @@ e_ews_folder_new_from_error (const GError *error)
 }
 
 gboolean
-e_ews_folder_is_error (EEwsFolder *folder)
+e_ews_folder_is_error (const EEwsFolder *folder)
 {
        g_return_val_if_fail (E_IS_EWS_FOLDER (folder), TRUE);
 
diff --git a/src/server/e-ews-folder.h b/src/server/e-ews-folder.h
index 546f39f..8de06fb 100644
--- a/src/server/e-ews-folder.h
+++ b/src/server/e-ews-folder.h
@@ -59,7 +59,7 @@ const gchar * e_ews_folder_type_to_nick (EEwsFolderType folder_type);
 EEwsFolderType e_ews_folder_type_from_nick (const gchar *folder_type_nick);
 EEwsFolder *   e_ews_folder_new_from_soap_parameter (ESoapParameter *param);
 EEwsFolder *   e_ews_folder_new_from_error (const GError *error);
-gboolean       e_ews_folder_is_error (EEwsFolder *folder);
+gboolean       e_ews_folder_is_error (const EEwsFolder *folder);
 const GError * e_ews_folder_get_error (const EEwsFolder *folder);
 const gchar *  e_ews_folder_get_name (const EEwsFolder *folder);
 void           e_ews_folder_set_name (EEwsFolder *folder, const gchar *new_name);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]