[evolution-ews/evolution-ews-3-12] Guard private update-related variables with an update lock



commit 331ec86473aec5a62362c79de66f522a4eea68ab
Author: Milan Crha <mcrha redhat com>
Date:   Wed May 7 12:42:36 2014 +0200

    Guard private update-related variables with an update lock
    
    These variables can be accessed from multiple threads in the same
    time, and if it happens, then it can cause a crash. There was a lock
    for it already, it only wasn't used.

 src/camel/camel-ews-store.c |   17 +++++++++++++----
 1 files changed, 13 insertions(+), 4 deletions(-)
---
diff --git a/src/camel/camel-ews-store.c b/src/camel/camel-ews-store.c
index c20303d..2c80411 100644
--- a/src/camel/camel-ews-store.c
+++ b/src/camel/camel-ews-store.c
@@ -747,11 +747,16 @@ camel_ews_folder_update_thread (gpointer user_data)
 {
        struct ScheduleUpdateData *sud = user_data;
        CamelEwsStore *ews_store = sud->ews_store;
-       GSList *l;
+       GSList *update_folder_names, *l;
 
        g_return_val_if_fail (sud != NULL, NULL);
 
-       for (l = ews_store->priv->update_folder_names; l != NULL && !g_cancellable_is_cancelled 
(sud->cancellable); l = l->next) {
+       UPDATE_LOCK (ews_store);
+       update_folder_names = ews_store->priv->update_folder_names;
+       ews_store->priv->update_folder_names = NULL;
+       UPDATE_UNLOCK (ews_store);
+
+       for (l = update_folder_names; l != NULL && !g_cancellable_is_cancelled (sud->cancellable); l = 
l->next) {
                const gchar *folder_name = l->data;
                CamelFolder *folder;
                GError *error = NULL;
@@ -770,9 +775,10 @@ camel_ews_folder_update_thread (gpointer user_data)
                }
        }
 
-       g_slist_free_full (ews_store->priv->update_folder_names, g_free);
-       ews_store->priv->update_folder_names = NULL;
+       g_slist_free_full (update_folder_names, g_free);
+       update_folder_names = NULL;
        free_schedule_update_data (sud);
+
        return NULL;
 }
 
@@ -891,6 +897,7 @@ folder_list_update_cb (gpointer user_data)
        g_return_val_if_fail (sud->ews_store != NULL, FALSE);
        g_return_val_if_fail (sud->ews_store->priv != NULL, FALSE);
 
+       UPDATE_LOCK (sud->ews_store);
        if (sud->expected_id != sud->ews_store->priv->update_folder_list_id)
                goto exit;
 
@@ -900,6 +907,8 @@ folder_list_update_cb (gpointer user_data)
                run_update_thread (sud->ews_store, TRUE, sud->cancellable);
 
 exit:
+       UPDATE_UNLOCK (sud->ews_store);
+
        return FALSE;
 }
 


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