diff options
author | Lionel Landwerlin <llandwerlin@gmail.com> | 2013-04-10 12:31:40 +0100 |
---|---|---|
committer | Lionel Landwerlin <llandwerlin@gmail.com> | 2013-04-10 15:19:34 +0100 |
commit | 03c9d5fa8887c91b9e99f4fa9bff9675dfb7e73f (patch) | |
tree | f8891775f7934bbd07b13bcb8e69870d89bbb9b7 | |
parent | 6bb589a5d87c2407c4d5a00dfc543b93906f0fa3 (diff) | |
download | gnome-settings-daemon-03c9d5fa8887c91b9e99f4fa9bff9675dfb7e73f.tar.gz |
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
-rw-r--r-- | 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 6c788971..0fc776f2 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++) { @@ -2252,6 +2254,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); } @@ -2264,6 +2269,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); |