[gnome-settings-daemon/gnome-3-8] media-keys: fix race condition



commit 307f421196c39502e7a4c7d20931a1d310c877bf
Author: Lionel Landwerlin <llandwerlin gmail com>
Date:   Wed Apr 10 12:31:40 2013 +0100

    media-keys: fix race condition
    
    For some reason I see a crash in the settings daemon in the
    gsettings_changed_cb() callback when accessing manager->priv->keys->len.
    
    It seems that the gsettings callback is called before
    manager->priv->keys is initialized. And that would happen after
    because init_kbd() which initialized manager->priv->keys is called
    upon shell's dbus appearance.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=697698

 plugins/media-keys/gsd-media-keys-manager.c |   11 +++++++++--
 1 files changed, 9 insertions(+), 2 deletions(-)
---
diff --git a/plugins/media-keys/gsd-media-keys-manager.c b/plugins/media-keys/gsd-media-keys-manager.c
index 9f86040..1120b8d 100644
--- a/plugins/media-keys/gsd-media-keys-manager.c
+++ b/plugins/media-keys/gsd-media-keys-manager.c
@@ -596,6 +596,10 @@ gsettings_changed_cb (GSettings           *settings,
 {
         int      i;
 
+        /* Give up if we don't have proxy to the shell */
+        if (!manager->priv->key_grabber)
+                return;
+
        /* handled in gsettings_custom_changed_cb() */
         if (g_str_equal (settings_key, "custom-keybindings"))
                return;
@@ -765,8 +769,6 @@ init_kbd (GsdMediaKeysManager *manager)
 
         gnome_settings_profile_start (NULL);
 
-        manager->priv->keys = g_ptr_array_new_with_free_func ((GDestroyNotify) media_key_free);
-
         /* Media keys
          * Add hard-coded shortcuts first so that they can't be preempted */
         for (i = 0; i < G_N_ELEMENTS (media_keys); i++) {
@@ -2250,6 +2252,9 @@ on_shell_vanished (GDBusConnection  *connection,
                    gpointer          user_data)
 {
         GsdMediaKeysManager *manager = user_data;
+
+        g_ptr_array_set_size (manager->priv->keys, 0);
+
         g_clear_object (&manager->priv->key_grabber);
         g_clear_object (&manager->priv->osd_proxy);
 }
@@ -2262,6 +2267,8 @@ start_media_keys_idle_cb (GsdMediaKeysManager *manager)
         g_debug ("Starting media_keys manager");
         gnome_settings_profile_start (NULL);
 
+        manager->priv->keys = g_ptr_array_new_with_free_func ((GDestroyNotify) media_key_free);
+
         initialize_volume_handler (manager);
 
         manager->priv->settings = g_settings_new (SETTINGS_BINDING_DIR);


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