aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/e-meeting-store.c
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2010-12-06 23:30:30 +0800
committerRodrigo Moya <rodrigo@gnome-db.org>2011-06-30 00:41:09 +0800
commit46e7f2378d76e28408bc149e6c2b06159ee780fb (patch)
treecf1fdc4166e4edcad9f8fe50837a2f8b863bc380 /calendar/gui/e-meeting-store.c
parent196e6a1f880e295e60fa037241a7fe52b45d746f (diff)
downloadgsoc2013-evolution-46e7f2378d76e28408bc149e6c2b06159ee780fb.tar
gsoc2013-evolution-46e7f2378d76e28408bc149e6c2b06159ee780fb.tar.gz
gsoc2013-evolution-46e7f2378d76e28408bc149e6c2b06159ee780fb.tar.bz2
gsoc2013-evolution-46e7f2378d76e28408bc149e6c2b06159ee780fb.tar.lz
gsoc2013-evolution-46e7f2378d76e28408bc149e6c2b06159ee780fb.tar.xz
gsoc2013-evolution-46e7f2378d76e28408bc149e6c2b06159ee780fb.tar.zst
gsoc2013-evolution-46e7f2378d76e28408bc149e6c2b06159ee780fb.zip
Bug #620234 - Invalid writes during free/busy
Diffstat (limited to 'calendar/gui/e-meeting-store.c')
-rw-r--r--calendar/gui/e-meeting-store.c36
1 files changed, 33 insertions, 3 deletions
diff --git a/calendar/gui/e-meeting-store.c b/calendar/gui/e-meeting-store.c
index 4893728a45..db7648d8f1 100644
--- a/calendar/gui/e-meeting-store.c
+++ b/calendar/gui/e-meeting-store.c
@@ -548,6 +548,25 @@ e_meeting_store_set_value (EMeetingStore *store, gint row, gint col, const gchar
}
}
+struct FindAttendeeData
+{
+ EMeetingAttendee *find;
+ EMeetingStoreQueueData *qdata;
+};
+
+static void
+find_attendee_cb (gpointer key, gpointer value, gpointer user_data)
+{
+ EMeetingStoreQueueData *qdata = value;
+ struct FindAttendeeData *fad = user_data;
+
+ g_return_if_fail (qdata != NULL);
+ g_return_if_fail (fad != NULL);
+
+ if (qdata->attendee == fad->find)
+ fad->qdata = qdata;
+}
+
static void
refresh_queue_remove (EMeetingStore *store, EMeetingAttendee *attendee)
{
@@ -560,6 +579,17 @@ refresh_queue_remove (EMeetingStore *store, EMeetingAttendee *attendee)
qdata = g_hash_table_lookup (
priv->refresh_data, itip_strip_mailto (
e_meeting_attendee_get_address (attendee)));
+ if (!qdata) {
+ struct FindAttendeeData fad = { 0 };
+
+ fad.find = attendee;
+ fad.qdata = NULL;
+
+ g_hash_table_foreach (priv->refresh_data, find_attendee_cb, &fad);
+
+ qdata = fad.qdata;
+ }
+
if (qdata) {
g_mutex_lock (priv->mutex);
g_hash_table_remove (
@@ -793,7 +823,7 @@ e_meeting_store_init (EMeetingStore *store)
store->priv->attendees = g_ptr_array_new ();
store->priv->refresh_queue = g_ptr_array_new ();
- store->priv->refresh_data = g_hash_table_new (g_str_hash, g_str_equal);
+ store->priv->refresh_data = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
store->priv->mutex = g_mutex_new ();
@@ -1615,8 +1645,8 @@ refresh_queue_add (EMeetingStore *store, gint row,
g_ptr_array_add (qdata->data, data);
g_hash_table_insert (
- priv->refresh_data, (gpointer) itip_strip_mailto (
- e_meeting_attendee_get_address (attendee)), qdata);
+ priv->refresh_data, g_strdup (itip_strip_mailto (
+ e_meeting_attendee_get_address (attendee))), qdata);
} else {
if (e_meeting_time_compare_times (start, &qdata->start) == -1)
qdata->start = *start;