[evolution/gnome-3-32] Prevent crash in cal_data_model_notify_recurrences_cb()



commit 7accf6bd6f1d5e3d1559b09e38e6020cf897b198
Author: Milan Crha <mcrha redhat com>
Date:   Thu May 2 10:23:18 2019 +0200

    Prevent crash in cal_data_model_notify_recurrences_cb()
    
    The ECalDataModel could use the reference to itself in the internal thread
    pool after the thread pool had been freed, together with the data model.
    This change prevents the crash by adding a reference on the data model
    for the whole internal thread run.
    
    Reported downstream at:
    https://bugzilla.redhat.com/show_bug.cgi?id=1705345

 src/calendar/gui/e-cal-data-model.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)
---
diff --git a/src/calendar/gui/e-cal-data-model.c b/src/calendar/gui/e-cal-data-model.c
index 2e2aab826e..dc2b22cbee 100644
--- a/src/calendar/gui/e-cal-data-model.c
+++ b/src/calendar/gui/e-cal-data-model.c
@@ -376,6 +376,7 @@ cal_data_model_emit_view_state_changed (ECalDataModel *data_model,
 typedef void (* InternalThreadJobFunc) (ECalDataModel *data_model, gpointer user_data);
 
 typedef struct _InternalThreadJobData {
+       ECalDataModel *data_model;
        InternalThreadJobFunc func;
        gpointer user_data;
 } InternalThreadJobData;
@@ -384,14 +385,14 @@ static void
 cal_data_model_internal_thread_job_func (gpointer data,
                                         gpointer user_data)
 {
-       ECalDataModel *data_model = user_data;
        InternalThreadJobData *job_data = data;
 
        g_return_if_fail (job_data != NULL);
        g_return_if_fail (job_data->func != NULL);
 
-       job_data->func (data_model, job_data->user_data);
+       job_data->func (job_data->data_model, job_data->user_data);
 
+       g_object_unref (job_data->data_model);
        g_free (job_data);
 }
 
@@ -406,6 +407,7 @@ cal_data_model_submit_internal_thread_job (ECalDataModel *data_model,
        g_return_if_fail (func != NULL);
 
        job_data = g_new0 (InternalThreadJobData, 1);
+       job_data->data_model = g_object_ref (data_model);
        job_data->func = func;
        job_data->user_data = user_data;
 


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