From 301607fc39fa6f85826b50339f082cd2fac796ec Mon Sep 17 00:00:00 2001 From: Michael Catanzaro Date: Jul 21 2019 19:26:25 +0000 Subject: Rename most-recent patches I've prepared upstream merge requests for these now. --- diff --git a/90.patch b/90.patch new file mode 100644 index 0000000..2324ad1 --- /dev/null +++ b/90.patch @@ -0,0 +1,55 @@ +From acd6f57e2121edcb6625ff02042e8c5b799b9d98 Mon Sep 17 00:00:00 2001 +From: Michael Catanzaro +Date: Sun, 21 Jul 2019 13:38:40 -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/gcal-event.c | 16 ++++++++++++++-- + 1 file changed, 14 insertions(+), 2 deletions(-) + +diff --git a/src/gcal-event.c b/src/gcal-event.c +index e8eada98..07c74222 100644 +--- a/src/gcal-event.c ++++ b/src/gcal-event.c +@@ -259,13 +259,19 @@ gcal_event_update_uid_internal (GcalEvent *self) + { + ECalComponentId *id; + const gchar *source_id; ++ gboolean should_update_cache = FALSE; + + /* Setup event uid */ + source_id = self->source ? e_source_get_uid (self->source) : ""; + id = e_cal_component_get_id (self->component); + +- /* Clear the previous uid */ +- g_clear_pointer (&self->uid, g_free); ++ if (self->uid != NULL) ++ { ++ should_update_cache = TRUE; ++ g_debug ("Removing '%s' (%p) from cache", self->uid, self); ++ g_hash_table_remove (event_cache, self->uid); ++ g_free (self->uid); ++ } + + if (id->rid != NULL) + { +@@ -281,6 +287,12 @@ gcal_event_update_uid_internal (GcalEvent *self) + id->uid); + } + ++ 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_free_id (id); + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_UID]); + } +-- +2.21.0 + diff --git a/92.patch b/92.patch new file mode 100644 index 0000000..faa38a2 --- /dev/null +++ b/92.patch @@ -0,0 +1,81 @@ +diff --git a/src/gcal-manager.c b/src/gcal-manager.c +index 54131aa8..bca45d8f 100644 +--- a/src/gcal-manager.c ++++ b/src/gcal-manager.c +@@ -345,7 +345,7 @@ on_client_connected (GObject *source_object, + ESourceRefresh *refresh_extension; + ESourceOffline *offline_extension; + GcalManager *self; +- ECalClient *client; ++ EClient *client; + ESource *source; + GError *error; + gboolean enabled; +@@ -353,8 +353,6 @@ on_client_connected (GObject *source_object, + GCAL_ENTRY; + + self = GCAL_MANAGER (user_data); +- source = e_client_get_source (E_CLIENT (source_object)); +- enabled = is_source_enabled (source); + + self->sources_at_launch--; + +@@ -362,28 +360,28 @@ on_client_connected (GObject *source_object, + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_LOADING]); + + error = NULL; +- client = E_CAL_CLIENT (e_cal_client_connect_finish (result, &error)); ++ client = e_cal_client_connect_finish (result, &error); + + if (error) + { +- remove_source (GCAL_MANAGER (user_data), source); +- g_warning ("%s: Failed to open/connect '%s': %s", ++ g_warning ("%s: Failed to open/connect calendar: %s", + G_STRFUNC, +- e_source_get_display_name (source), + error->message); + +- g_object_unref (source); + g_error_free (error); + return; + } + ++ source = e_client_get_source (client); ++ enabled = is_source_enabled (source); ++ + g_object_set_data (G_OBJECT (source), "client", client); + + unit = g_new0 (GcalManagerUnit, 1); + unit->connected = TRUE; +- unit->client = g_object_ref (client); ++ unit->client = g_object_ref (E_CAL_CLIENT (client)); + +- g_hash_table_insert (self->clients, source, unit); ++ g_hash_table_insert (self->clients, g_object_ref (source), unit); + + g_debug ("Source %s (%s) connected", + e_source_get_display_name (source), +@@ -394,15 +392,17 @@ on_client_connected (GObject *source_object, + + if (enabled) + { +- e_cal_data_model_add_client (self->e_data_model, client); +- e_cal_data_model_add_client (self->search_data_model, client); ++ ECalClient *cal_client = E_CAL_CLIENT (client); ++ ++ e_cal_data_model_add_client (self->e_data_model, cal_client); ++ e_cal_data_model_add_client (self->search_data_model, cal_client); + if (self->shell_search_data_model != NULL) +- e_cal_data_model_add_client (self->shell_search_data_model, client); ++ e_cal_data_model_add_client (self->shell_search_data_model, cal_client); + } + + /* refresh client when it's added */ +- if (enabled && e_client_check_refresh_supported (E_CLIENT (client))) +- e_client_refresh (E_CLIENT (client), NULL, on_client_refreshed, user_data); ++ if (enabled && e_client_check_refresh_supported (client)) ++ e_client_refresh (client, NULL, on_client_refreshed, user_data); + + /* Cache all the online calendars, so the user can see them offline */ + offline_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_OFFLINE); diff --git a/gnome-calendar.spec b/gnome-calendar.spec index f45b44d..cbf404d 100644 --- a/gnome-calendar.spec +++ b/gnome-calendar.spec @@ -41,10 +41,8 @@ Patch2: 80.patch Patch3: 81.patch Patch4: 83.patch Patch5: 86.patch - -# From https://gitlab.gnome.org/GNOME/gnome-calendar/issues -Patch6: issue-434.patch -Patch7: issue-435.patch +Patch6: 90.patch +Patch7: 92.patch Requires: evolution-data-server%{?_isa} >= %{edataserver_version} Requires: glib2%{?_isa} >= %{glib2_version} diff --git a/issue-434.patch b/issue-434.patch deleted file mode 100644 index 2324ad1..0000000 --- a/issue-434.patch +++ /dev/null @@ -1,55 +0,0 @@ -From acd6f57e2121edcb6625ff02042e8c5b799b9d98 Mon Sep 17 00:00:00 2001 -From: Michael Catanzaro -Date: Sun, 21 Jul 2019 13:38:40 -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/gcal-event.c | 16 ++++++++++++++-- - 1 file changed, 14 insertions(+), 2 deletions(-) - -diff --git a/src/gcal-event.c b/src/gcal-event.c -index e8eada98..07c74222 100644 ---- a/src/gcal-event.c -+++ b/src/gcal-event.c -@@ -259,13 +259,19 @@ gcal_event_update_uid_internal (GcalEvent *self) - { - ECalComponentId *id; - const gchar *source_id; -+ gboolean should_update_cache = FALSE; - - /* Setup event uid */ - source_id = self->source ? e_source_get_uid (self->source) : ""; - id = e_cal_component_get_id (self->component); - -- /* Clear the previous uid */ -- g_clear_pointer (&self->uid, g_free); -+ if (self->uid != NULL) -+ { -+ should_update_cache = TRUE; -+ g_debug ("Removing '%s' (%p) from cache", self->uid, self); -+ g_hash_table_remove (event_cache, self->uid); -+ g_free (self->uid); -+ } - - if (id->rid != NULL) - { -@@ -281,6 +287,12 @@ gcal_event_update_uid_internal (GcalEvent *self) - id->uid); - } - -+ 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_free_id (id); - g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_UID]); - } --- -2.21.0 - diff --git a/issue-435.patch b/issue-435.patch deleted file mode 100644 index faa38a2..0000000 --- a/issue-435.patch +++ /dev/null @@ -1,81 +0,0 @@ -diff --git a/src/gcal-manager.c b/src/gcal-manager.c -index 54131aa8..bca45d8f 100644 ---- a/src/gcal-manager.c -+++ b/src/gcal-manager.c -@@ -345,7 +345,7 @@ on_client_connected (GObject *source_object, - ESourceRefresh *refresh_extension; - ESourceOffline *offline_extension; - GcalManager *self; -- ECalClient *client; -+ EClient *client; - ESource *source; - GError *error; - gboolean enabled; -@@ -353,8 +353,6 @@ on_client_connected (GObject *source_object, - GCAL_ENTRY; - - self = GCAL_MANAGER (user_data); -- source = e_client_get_source (E_CLIENT (source_object)); -- enabled = is_source_enabled (source); - - self->sources_at_launch--; - -@@ -362,28 +360,28 @@ on_client_connected (GObject *source_object, - g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_LOADING]); - - error = NULL; -- client = E_CAL_CLIENT (e_cal_client_connect_finish (result, &error)); -+ client = e_cal_client_connect_finish (result, &error); - - if (error) - { -- remove_source (GCAL_MANAGER (user_data), source); -- g_warning ("%s: Failed to open/connect '%s': %s", -+ g_warning ("%s: Failed to open/connect calendar: %s", - G_STRFUNC, -- e_source_get_display_name (source), - error->message); - -- g_object_unref (source); - g_error_free (error); - return; - } - -+ source = e_client_get_source (client); -+ enabled = is_source_enabled (source); -+ - g_object_set_data (G_OBJECT (source), "client", client); - - unit = g_new0 (GcalManagerUnit, 1); - unit->connected = TRUE; -- unit->client = g_object_ref (client); -+ unit->client = g_object_ref (E_CAL_CLIENT (client)); - -- g_hash_table_insert (self->clients, source, unit); -+ g_hash_table_insert (self->clients, g_object_ref (source), unit); - - g_debug ("Source %s (%s) connected", - e_source_get_display_name (source), -@@ -394,15 +392,17 @@ on_client_connected (GObject *source_object, - - if (enabled) - { -- e_cal_data_model_add_client (self->e_data_model, client); -- e_cal_data_model_add_client (self->search_data_model, client); -+ ECalClient *cal_client = E_CAL_CLIENT (client); -+ -+ e_cal_data_model_add_client (self->e_data_model, cal_client); -+ e_cal_data_model_add_client (self->search_data_model, cal_client); - if (self->shell_search_data_model != NULL) -- e_cal_data_model_add_client (self->shell_search_data_model, client); -+ e_cal_data_model_add_client (self->shell_search_data_model, cal_client); - } - - /* refresh client when it's added */ -- if (enabled && e_client_check_refresh_supported (E_CLIENT (client))) -- e_client_refresh (E_CLIENT (client), NULL, on_client_refreshed, user_data); -+ if (enabled && e_client_check_refresh_supported (client)) -+ e_client_refresh (client, NULL, on_client_refreshed, user_data); - - /* Cache all the online calendars, so the user can see them offline */ - offline_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_OFFLINE);