From 748b7207e7f8d03cc1c3f8a63ec4a0573dabc71e Mon Sep 17 00:00:00 2001 From: Michael Catanzaro Date: Tue, 16 Jul 2019 19:40:06 -0500 Subject: [PATCH] Don't leave dangling pointers in the GcalEvent cache The cache has an unowned pointer to the GcalEvent's UID. We need to update the cache with the GcalEvent's new UID to avoid use-after-free. Fixes #434 --- src/core/gcal-event.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/core/gcal-event.c b/src/core/gcal-event.c index ef16bf04..5bb91256 100644 --- a/src/core/gcal-event.c +++ b/src/core/gcal-event.c @@ -256,13 +256,20 @@ gcal_event_update_uid_internal (GcalEvent *self) { ECalComponentId *id; const gchar *source_id; + gboolean should_update_cache; /* Setup event uid */ source_id = self->calendar ? gcal_calendar_get_id (self->calendar) : ""; id = e_cal_component_get_id (self->component); - /* Clear the previous uid */ - g_clear_pointer (&self->uid, g_free); + should_update_cache = self->uid != NULL; + + if (should_update_cache) + { + g_debug ("Removing '%s' (%p) from cache", self->uid, self); + g_hash_table_remove (event_cache, self->uid); + g_clear_pointer (&self->uid, g_free); + } if (e_cal_component_id_get_rid (id) != NULL) { @@ -278,6 +285,12 @@ gcal_event_update_uid_internal (GcalEvent *self) e_cal_component_id_get_uid (id)); } + if (should_update_cache) + { + g_debug ("Adding %s to the cache", self->uid); + g_hash_table_insert (event_cache, self->uid, self); + } + e_cal_component_id_free (id); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_UID]); }