[evolution] Fix a use-after-free after editor's WebKitWebProcess crash ][



commit 5e1469d219dafda291d4576e7814736e9544d373
Author: Milan Crha <mcrha redhat com>
Date:   Wed Dec 14 18:32:18 2016 +0100

    Fix a use-after-free after editor's WebKitWebProcess crash ][
    
    Correct one missed detail in the code.

 src/modules/webkit-editor/e-webkit-editor.c |   36 ++++++++++++++++++---------
 1 files changed, 24 insertions(+), 12 deletions(-)
---
diff --git a/src/modules/webkit-editor/e-webkit-editor.c b/src/modules/webkit-editor/e-webkit-editor.c
index 67ac49f..7f35ffc 100644
--- a/src/modules/webkit-editor/e-webkit-editor.c
+++ b/src/modules/webkit-editor/e-webkit-editor.c
@@ -68,6 +68,7 @@ struct _EWebKitEditorPrivate {
 
        GCancellable *cancellable;
        GDBusProxy *web_extension;
+       GDBusConnection *dbus_connection;
        guint web_extension_watch_name_id;
        guint web_extension_selection_changed_cb_id;
        guint web_extension_content_changed_cb_id;
@@ -505,10 +506,13 @@ web_extension_proxy_created_cb (GDBusProxy *proxy,
                return;
        }
 
+       g_clear_object (&wk_editor->priv->dbus_connection);
+       wk_editor->priv->dbus_connection = g_object_ref (g_dbus_proxy_get_connection 
(wk_editor->priv->web_extension));
+
        if (wk_editor->priv->web_extension_selection_changed_cb_id == 0) {
                wk_editor->priv->web_extension_selection_changed_cb_id =
                        g_dbus_connection_signal_subscribe (
-                               g_dbus_proxy_get_connection (wk_editor->priv->web_extension),
+                               wk_editor->priv->dbus_connection,
                                g_dbus_proxy_get_name (wk_editor->priv->web_extension),
                                E_WEBKIT_EDITOR_WEB_EXTENSION_INTERFACE,
                                "SelectionChanged",
@@ -523,7 +527,7 @@ web_extension_proxy_created_cb (GDBusProxy *proxy,
        if (wk_editor->priv->web_extension_content_changed_cb_id == 0) {
                wk_editor->priv->web_extension_content_changed_cb_id =
                        g_dbus_connection_signal_subscribe (
-                               g_dbus_proxy_get_connection (wk_editor->priv->web_extension),
+                               wk_editor->priv->dbus_connection,
                                g_dbus_proxy_get_name (wk_editor->priv->web_extension),
                                E_WEBKIT_EDITOR_WEB_EXTENSION_INTERFACE,
                                "ContentChanged",
@@ -538,7 +542,7 @@ web_extension_proxy_created_cb (GDBusProxy *proxy,
        if (wk_editor->priv->web_extension_undo_redo_state_changed_cb_id == 0) {
                wk_editor->priv->web_extension_undo_redo_state_changed_cb_id =
                        g_dbus_connection_signal_subscribe (
-                               g_dbus_proxy_get_connection (wk_editor->priv->web_extension),
+                               wk_editor->priv->dbus_connection,
                                g_dbus_proxy_get_name (wk_editor->priv->web_extension),
                                E_WEBKIT_EDITOR_WEB_EXTENSION_INTERFACE,
                                "UndoRedoStateChanged",
@@ -553,7 +557,7 @@ web_extension_proxy_created_cb (GDBusProxy *proxy,
        if (wk_editor->priv->web_extension_user_changed_default_colors_cb_id == 0) {
                wk_editor->priv->web_extension_user_changed_default_colors_cb_id =
                        g_dbus_connection_signal_subscribe (
-                               g_dbus_proxy_get_connection (wk_editor->priv->web_extension),
+                               wk_editor->priv->dbus_connection,
                                g_dbus_proxy_get_name (wk_editor->priv->web_extension),
                                E_WEBKIT_EDITOR_WEB_EXTENSION_INTERFACE,
                                "UserChangedDefaultColors",
@@ -607,7 +611,14 @@ web_extension_vanished_cb (GDBusConnection *connection,
                            const gchar *name,
                            EWebKitEditor *wk_editor)
 {
+       g_return_if_fail (E_IS_WEBKIT_EDITOR (wk_editor));
+
        g_clear_object (&wk_editor->priv->web_extension);
+
+       if (wk_editor->priv->web_extension_watch_name_id > 0) {
+               g_bus_unwatch_name (wk_editor->priv->web_extension_watch_name_id);
+               wk_editor->priv->web_extension_watch_name_id = 0;
+       }
 }
 
 static void
@@ -5065,30 +5076,30 @@ webkit_editor_dispose (GObject *object)
                priv->mail_settings = NULL;
        }
 
-       if (priv->web_extension_content_changed_cb_id > 0) {
+       if (priv->web_extension_content_changed_cb_id > 0 && priv->dbus_connection) {
                g_dbus_connection_signal_unsubscribe (
-                       g_dbus_proxy_get_connection (priv->web_extension),
+                       priv->dbus_connection,
                        priv->web_extension_content_changed_cb_id);
                priv->web_extension_content_changed_cb_id = 0;
        }
 
-       if (priv->web_extension_selection_changed_cb_id > 0) {
+       if (priv->web_extension_selection_changed_cb_id > 0 && priv->dbus_connection) {
                g_dbus_connection_signal_unsubscribe (
-                       g_dbus_proxy_get_connection (priv->web_extension),
+                       priv->dbus_connection,
                        priv->web_extension_selection_changed_cb_id);
                priv->web_extension_selection_changed_cb_id = 0;
        }
 
-       if (priv->web_extension_undo_redo_state_changed_cb_id > 0) {
+       if (priv->web_extension_undo_redo_state_changed_cb_id > 0 && priv->dbus_connection) {
                g_dbus_connection_signal_unsubscribe (
-                       g_dbus_proxy_get_connection (priv->web_extension),
+                       priv->dbus_connection,
                        priv->web_extension_undo_redo_state_changed_cb_id);
                priv->web_extension_undo_redo_state_changed_cb_id = 0;
        }
 
-       if (priv->web_extension_user_changed_default_colors_cb_id > 0) {
+       if (priv->web_extension_user_changed_default_colors_cb_id > 0 && priv->dbus_connection) {
                g_dbus_connection_signal_unsubscribe (
-                       g_dbus_proxy_get_connection (priv->web_extension),
+                       priv->dbus_connection,
                        priv->web_extension_user_changed_default_colors_cb_id);
                priv->web_extension_user_changed_default_colors_cb_id = 0;
        }
@@ -5115,6 +5126,7 @@ webkit_editor_dispose (GObject *object)
        webkit_editor_finish_search (E_WEBKIT_EDITOR (object));
 
        g_clear_object (&priv->web_extension);
+       g_clear_object (&priv->dbus_connection);
 
        /* Chain up to parent's dispose() method. */
        G_OBJECT_CLASS (e_webkit_editor_parent_class)->dispose (object);


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