summaryrefslogtreecommitdiff
path: root/gnome-base/gnome-keyring/files/3.31.91-race-fix2.patch
diff options
context:
space:
mode:
Diffstat (limited to 'gnome-base/gnome-keyring/files/3.31.91-race-fix2.patch')
-rw-r--r--gnome-base/gnome-keyring/files/3.31.91-race-fix2.patch104
1 files changed, 104 insertions, 0 deletions
diff --git a/gnome-base/gnome-keyring/files/3.31.91-race-fix2.patch b/gnome-base/gnome-keyring/files/3.31.91-race-fix2.patch
new file mode 100644
index 000000000000..c51ffbef44ad
--- /dev/null
+++ b/gnome-base/gnome-keyring/files/3.31.91-race-fix2.patch
@@ -0,0 +1,104 @@
+From 5d088356a9473c06564bd2cef18ca370437a17bc Mon Sep 17 00:00:00 2001
+From: Benjamin Berg <bberg@redhat.com>
+Date: Tue, 14 May 2019 17:42:29 +0200
+Subject: [PATCH 2/2] dbus-environment: Make Setenv request synchronuous
+
+Currently there is a potential race condition where the Setenv request
+races further session startup. i.e. the clients that are started with
+--start on login may quit before the Setenv DBus call is delivered. This
+opens a theoretical race condition where gnome-session is already past
+the initialization phase when it serves the Setenv request.
+---
+ daemon/dbus/gkd-dbus-environment.c | 62 +++++++++++++++---------------
+ 1 file changed, 30 insertions(+), 32 deletions(-)
+
+diff --git a/daemon/dbus/gkd-dbus-environment.c b/daemon/dbus/gkd-dbus-environment.c
+index 051de953..acf398b9 100644
+--- a/daemon/dbus/gkd-dbus-environment.c
++++ b/daemon/dbus/gkd-dbus-environment.c
+@@ -38,32 +38,13 @@ gkd_dbus_environment_cleanup (GDBusConnection *conn)
+ /* Nothing to do here */
+ }
+
+-static void
+-on_setenv_reply (GObject *source,
+- GAsyncResult *result,
+- gpointer user_data)
+-{
+- GError *error = NULL;
+- GVariant *res;
+-
+- res = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source), result, &error);
+-
+- if (error != NULL) {
+- if (g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_SERVICE_UNKNOWN))
+- g_debug ("couldn't set environment variable in session: %s", error->message);
+- else
+- g_message ("couldn't set environment variable in session: %s", error->message);
+- g_error_free (error);
+- }
+-
+- g_clear_pointer (&res, g_variant_unref);
+-}
+-
+ static void
+ setenv_request (GDBusConnection *conn, const gchar *env)
+ {
+ const gchar *value;
+ gchar *name;
++ GVariant *res;
++ GError *error = NULL;
+
+ /* Find the value part of the environment variable */
+ value = strchr (env, '=');
+@@ -73,19 +54,36 @@ setenv_request (GDBusConnection *conn, const gchar *env)
+ name = g_strndup (env, value - env);
+ ++value;
+
+- g_dbus_connection_call (conn,
+- SERVICE_SESSION_MANAGER,
+- PATH_SESSION_MANAGER,
+- IFACE_SESSION_MANAGER,
+- "Setenv",
+- g_variant_new ("(ss)",
+- name,
+- value),
+- NULL, G_DBUS_CALL_FLAGS_NONE,
+- -1, NULL,
+- on_setenv_reply, NULL);
++ /* Note: This call does not neccessarily need to be a sync call. However
++ * under certain conditions the process will quit immediately
++ * after emitting the call. This ensures that we wait long enough
++ * for the message to be sent out (could also be done using
++ * g_dbus_connection_flush() in the exit handler when called with
++ * --start) and also ensures that gnome-session has processed the
++ * DBus message before possibly thinking that the startup of
++ * gnome-keyring has finished and continuing with forking the
++ * shell. */
++ res = g_dbus_connection_call_sync (conn,
++ SERVICE_SESSION_MANAGER,
++ PATH_SESSION_MANAGER,
++ IFACE_SESSION_MANAGER,
++ "Setenv",
++ g_variant_new ("(ss)",
++ name,
++ value),
++ NULL, G_DBUS_CALL_FLAGS_NONE,
++ -1, NULL, &error);
++
++ if (error != NULL) {
++ if (g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_SERVICE_UNKNOWN))
++ g_debug ("couldn't set environment variable in session: %s", error->message);
++ else
++ g_message ("couldn't set environment variable in session: %s", error->message);
++ g_error_free (error);
++ }
+
+ g_free (name);
++ g_clear_pointer (&res, g_variant_unref);
+ }
+
+ static void
+--
+2.20.1
+