File gdm-drop-weak-refs-on-the-GDBusConnection.patch of Package gdm.14226

From 043804e1daeea506665073f67a884b1f1ae6f396 Mon Sep 17 00:00:00 2001
From: Robert Ancell <robert.ancell@canonical.com>
Date: Tue, 5 Dec 2017 14:20:41 +1300
Subject: [PATCH 01/10] Generate autocleanup definitions in libgdm

---
 libgdm/Makefile.am  | 2 ++
 libgdm/gdm-client.h | 4 ++++
 2 files changed, 6 insertions(+)

diff --git a/libgdm/Makefile.am b/libgdm/Makefile.am
index 99ada9a..2f7d7b6 100644
--- a/libgdm/Makefile.am
+++ b/libgdm/Makefile.am
@@ -12,6 +12,7 @@ gdm-manager-glue.c gdm-manager-glue.h : $(top_srcdir)/daemon/gdm-manager.xml Mak
 		--c-namespace Gdm				\
 		--interface-prefix=org.gnome.DisplayManager		\
 		--generate-c-code=gdm-manager-glue			\
+		--c-generate-autocleanup=all				\
 		--annotate "org.gnome.DisplayManager.Manager"		\
 		           "org.gtk.GDBus.C.Name" Manager		\
 		$(top_srcdir)/daemon/gdm-manager.xml
@@ -21,6 +22,7 @@ gdm-client-glue.c gdm-client-glue.h : $(top_srcdir)/daemon/gdm-session.xml Makef
 		--c-namespace Gdm				\
 		--interface-prefix=org.gnome.DisplayManager		\
 		--generate-c-code=gdm-client-glue			\
+		--c-generate-autocleanup=all				\
 		--annotate "org.gnome.DisplayManager.UserVerifier"	\
 		           "org.gtk.GDBus.C.Name" UserVerifier	\
 		--annotate "org.gnome.DisplayManager.Greeter"		\
diff --git a/libgdm/gdm-client.h b/libgdm/gdm-client.h
index 1ae3d39..8718a2e 100644
--- a/libgdm/gdm-client.h
+++ b/libgdm/gdm-client.h
@@ -122,6 +122,10 @@ GdmChooser        *gdm_client_get_chooser_sync          (GdmClient *client,
                                                          GCancellable     *cancellable,
                                                          GError          **error);
 
+#if GLIB_CHECK_VERSION(2, 44, 0)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (GdmClient, g_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GDM_CLIENT_H */
-- 
2.24.1


From 4337d1549bed19f356a45b3af0a215a3b878379e Mon Sep 17 00:00:00 2001
From: Robert Ancell <robert.ancell@canonical.com>
Date: Mon, 4 Dec 2017 16:15:59 +1300
Subject: [PATCH 02/10] Replace deprecated GSimpleAsyncResult with GTask

https://bugzilla.gnome.org/show_bug.cgi?id=783082
---
 libgdm/gdm-client.c | 531 ++++++++++++++++++++------------------------
 1 file changed, 235 insertions(+), 296 deletions(-)

diff --git a/libgdm/gdm-client.c b/libgdm/gdm-client.c
index 6fd55bd..bcae8ba 100644
--- a/libgdm/gdm-client.c
+++ b/libgdm/gdm-client.c
@@ -77,13 +77,13 @@ gdm_client_error_quark (void)
 static void
 on_got_manager (GdmManager          *manager,
                 GAsyncResult        *result,
-                GSimpleAsyncResult  *operation_result)
+                GTask               *task)
 {
         GdmClient *client;
         GdmManager       *new_manager;
         GError           *error;
 
-        client = GDM_CLIENT (g_async_result_get_source_object (G_ASYNC_RESULT (operation_result)));
+        client = GDM_CLIENT (g_async_result_get_source_object (G_ASYNC_RESULT (task)));
 
         error = NULL;
         new_manager = gdm_manager_proxy_new_finish (result, &error);
@@ -99,16 +99,14 @@ on_got_manager (GdmManager          *manager,
         }
 
         if (error != NULL) {
-                g_simple_async_result_take_error (operation_result, error);
+                g_task_return_error (task, error);
         } else {
-                g_simple_async_result_set_op_res_gpointer (operation_result,
-                                                           g_object_ref (client->priv->manager),
-                                                           (GDestroyNotify)
-                                                           g_object_unref);
+                g_task_return_pointer (task,
+                                       g_object_ref (client->priv->manager),
+                                       (GDestroyNotify) g_object_unref);
         }
 
-        g_simple_async_result_complete_in_idle (operation_result);
-        g_object_unref (operation_result);
+        g_object_unref (task);
         g_object_unref (client);
 }
 
@@ -118,21 +116,18 @@ get_manager (GdmClient           *client,
              GAsyncReadyCallback  callback,
              gpointer             user_data)
 {
-        GSimpleAsyncResult *result;
+        GTask *task;
 
-        result = g_simple_async_result_new (G_OBJECT (client),
-                                            callback,
-                                            user_data,
-                                            get_manager);
-        g_simple_async_result_set_check_cancellable (result, cancellable);
+        task = g_task_new (G_OBJECT (client),
+                           cancellable,
+                           callback,
+                           user_data);
 
         if (client->priv->manager != NULL) {
-                g_simple_async_result_set_op_res_gpointer (result,
-                                                           g_object_ref (client->priv->manager),
-                                                           (GDestroyNotify)
-                                                           g_object_unref);
-                g_simple_async_result_complete_in_idle (result);
-                g_object_unref (result);
+                g_task_return_pointer (task,
+                                       g_object_ref (client->priv->manager),
+                                       (GDestroyNotify) g_object_unref);
+                g_object_unref (task);
                 return;
         }
 
@@ -143,20 +138,47 @@ get_manager (GdmClient           *client,
                                        cancellable,
                                        (GAsyncReadyCallback)
                                        on_got_manager,
-                                       result);
+                                       task);
+}
+
+typedef struct {
+        GTask           *task;
+        GdmUserVerifier *user_verifier;
+} UserVerifierData;
+
+static UserVerifierData *
+user_verifier_data_new (GTask *task, GdmUserVerifier *user_verifier)
+{
+        UserVerifierData *data;
+
+        data = g_slice_new (UserVerifierData);
+        data->task = g_object_ref (task);
+        data->user_verifier = g_object_ref (user_verifier);
+
+        return data;
+}
+
+static void
+user_verifier_data_free (UserVerifierData *data)
+{
+        g_object_unref (data->task);
+        g_object_unref (data->user_verifier);
+        g_slice_free (UserVerifierData, data);
 }
 
 static void
 complete_user_verifier_proxy_operation (GdmClient          *client,
-                                        GSimpleAsyncResult *operation_result)
+                                        UserVerifierData   *data)
 {
-        g_simple_async_result_complete_in_idle (operation_result);
-        g_object_unref (operation_result);
+        g_task_return_pointer (data->task,
+                               g_object_ref (data->user_verifier),
+                               (GDestroyNotify) g_object_unref);
+        user_verifier_data_free (data);
 }
 
 static void
 maybe_complete_user_verifier_proxy_operation (GdmClient          *client,
-                                              GSimpleAsyncResult *operation_result)
+                                              UserVerifierData   *data)
 {
         GHashTableIter iter;
         gpointer key, value;
@@ -169,19 +191,19 @@ maybe_complete_user_verifier_proxy_operation (GdmClient          *client,
                 }
         }
 
-        complete_user_verifier_proxy_operation (client, operation_result);
+        complete_user_verifier_proxy_operation (client, data);
 }
 
 static void
 on_user_verifier_choice_list_proxy_created (GObject            *source,
                                             GAsyncResult       *result,
-                                            GSimpleAsyncResult *operation_result)
+                                            UserVerifierData   *data)
 {
         GdmClient                 *client;
         GdmUserVerifierChoiceList *choice_list;
         GError                    *error = NULL;
 
-        client = GDM_CLIENT (g_async_result_get_source_object (G_ASYNC_RESULT (operation_result)));
+        client = GDM_CLIENT (g_async_result_get_source_object (G_ASYNC_RESULT (data->task)));
 
         choice_list = gdm_user_verifier_choice_list_proxy_new_finish (result, &error);
 
@@ -193,13 +215,13 @@ on_user_verifier_choice_list_proxy_created (GObject            *source,
                 g_hash_table_replace (client->priv->user_verifier_extensions, gdm_user_verifier_choice_list_interface_info ()->name, choice_list);
         }
 
-        maybe_complete_user_verifier_proxy_operation (client, operation_result);
+        maybe_complete_user_verifier_proxy_operation (client, data);
 }
 
 static void
 on_user_verifier_extensions_enabled (GdmUserVerifier    *user_verifier,
                                      GAsyncResult       *result,
-                                     GSimpleAsyncResult *operation_result)
+                                     UserVerifierData   *data)
 {
         GdmClient *client;
         GCancellable *cancellable;
@@ -207,8 +229,8 @@ on_user_verifier_extensions_enabled (GdmUserVerifier    *user_verifier,
         GError    *error = NULL;
         size_t     i;
 
-        client = GDM_CLIENT (g_async_result_get_source_object (G_ASYNC_RESULT (operation_result)));
-        cancellable = g_object_get_data (G_OBJECT (operation_result), "cancellable");
+        client = GDM_CLIENT (g_async_result_get_source_object (G_ASYNC_RESULT (data->task)));
+        cancellable = g_task_get_cancellable (data->task);
 
         gdm_user_verifier_call_enable_extensions_finish (user_verifier, result, &error);
 
@@ -216,7 +238,7 @@ on_user_verifier_extensions_enabled (GdmUserVerifier    *user_verifier,
                 g_debug ("Couldn't enable user verifier extensions: %s",
                          error->message);
                 g_clear_error (&error);
-                complete_user_verifier_proxy_operation (client, operation_result);
+                complete_user_verifier_proxy_operation (client, data);
                 return;
         }
 
@@ -236,7 +258,7 @@ on_user_verifier_extensions_enabled (GdmUserVerifier    *user_verifier,
                                                                  cancellable,
                                                                  (GAsyncReadyCallback)
                                                                  on_user_verifier_choice_list_proxy_created,
-                                                                 operation_result);
+                                                                 data);
                 } else {
                         g_debug ("User verifier extension %s is unsupported", client->priv->enabled_extensions[i]);
                         g_hash_table_remove (client->priv->user_verifier_extensions,
@@ -246,7 +268,7 @@ on_user_verifier_extensions_enabled (GdmUserVerifier    *user_verifier,
 
         if (g_hash_table_size (client->priv->user_verifier_extensions) == 0) {
                 g_debug ("No supported user verifier extensions");
-                complete_user_verifier_proxy_operation (client, operation_result);
+                complete_user_verifier_proxy_operation (client, data);
         }
 
 }
@@ -263,7 +285,7 @@ free_interface_skeleton (GDBusInterfaceSkeleton *interface)
 static void
 on_user_verifier_proxy_created (GObject            *source,
                                 GAsyncResult       *result,
-                                GSimpleAsyncResult *operation_result)
+                                GTask              *task)
 {
         GdmClient       *self;
         GdmUserVerifier *user_verifier;
@@ -272,24 +294,20 @@ on_user_verifier_proxy_created (GObject            *source,
 
         user_verifier = gdm_user_verifier_proxy_new_finish (result, &error);
         if (user_verifier == NULL) {
-                g_simple_async_result_take_error (operation_result, error);
-                g_simple_async_result_complete_in_idle (operation_result);
-                g_object_unref (operation_result);
+                g_task_return_error (task, error);
+                g_object_unref (task);
                 return;
         }
 
         g_debug ("UserVerifier %p created", user_verifier);
 
-        g_simple_async_result_set_op_res_gpointer (operation_result,
-                                                   user_verifier,
-                                                   (GDestroyNotify)
-                                                   g_object_unref);
-
-        self = GDM_CLIENT (g_async_result_get_source_object (G_ASYNC_RESULT (operation_result)));
+        self = GDM_CLIENT (g_async_result_get_source_object (G_ASYNC_RESULT (task)));
         if (self->priv->enabled_extensions == NULL) {
                 g_debug ("no enabled extensions");
-                g_simple_async_result_complete_in_idle (operation_result);
-                g_object_unref (operation_result);
+                g_task_return_pointer (task,
+                                       user_verifier,
+                                       (GDestroyNotify) g_object_unref);
+                g_object_unref (task);
                 return;
         }
 
@@ -298,21 +316,21 @@ on_user_verifier_proxy_created (GObject            *source,
                                                                       NULL,
                                                                       (GDestroyNotify)
                                                                       free_interface_skeleton);
-        cancellable = g_object_get_data (G_OBJECT (operation_result), "cancellable");
+        cancellable = g_task_get_cancellable (task);
         gdm_user_verifier_call_enable_extensions (user_verifier,
                                                   (const char * const *)
                                                   self->priv->enabled_extensions,
                                                   cancellable,
                                                   (GAsyncReadyCallback)
                                                   on_user_verifier_extensions_enabled,
-                                                  operation_result);
-
+                                                  user_verifier_data_new (task, user_verifier));
+        g_object_unref (user_verifier);
 }
 
 static void
 on_reauthentication_channel_connected (GObject            *source_object,
                                        GAsyncResult       *result,
-                                       GSimpleAsyncResult *operation_result)
+                                       GTask              *task)
 {
         GDBusConnection *connection;
         GCancellable *cancellable;
@@ -321,13 +339,12 @@ on_reauthentication_channel_connected (GObject            *source_object,
         error = NULL;
         connection = g_dbus_connection_new_for_address_finish (result, &error);
         if (!connection) {
-                g_simple_async_result_take_error (operation_result, error);
-                g_simple_async_result_complete_in_idle (operation_result);
-                g_object_unref (operation_result);
+                g_task_return_error (task, error);
+                g_object_unref (task);
                 return;
         }
 
-        cancellable = g_object_get_data (G_OBJECT (operation_result), "cancellable");
+        cancellable = g_task_get_cancellable (task);
         gdm_user_verifier_proxy_new (connection,
                                      G_DBUS_PROXY_FLAGS_NONE,
                                      NULL,
@@ -335,14 +352,14 @@ on_reauthentication_channel_connected (GObject            *source_object,
                                      cancellable,
                                      (GAsyncReadyCallback)
                                      on_user_verifier_proxy_created,
-                                     operation_result);
+                                     task);
         g_object_unref (connection);
 }
 
 static void
 on_reauthentication_channel_opened (GdmManager         *manager,
                                     GAsyncResult       *result,
-                                    GSimpleAsyncResult *operation_result)
+                                    GTask              *task)
 {
         GCancellable *cancellable;
         char         *address;
@@ -353,48 +370,45 @@ on_reauthentication_channel_opened (GdmManager         *manager,
                                                                     &address,
                                                                     result,
                                                                     &error)) {
-                g_simple_async_result_take_error (operation_result, error);
-                g_simple_async_result_complete_in_idle (operation_result);
-                g_object_unref (operation_result);
+                g_task_return_error (task, error);
+                g_object_unref (task);
                 return;
         }
 
-        cancellable = g_object_get_data (G_OBJECT (operation_result), "cancellable");
+        cancellable = g_task_get_cancellable (task);
         g_dbus_connection_new_for_address (address,
                                            G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT,
                                            NULL,
                                            cancellable,
                                            (GAsyncReadyCallback)
                                            on_reauthentication_channel_connected,
-                                           operation_result);
+                                           task);
 }
 
 static void
 on_got_manager_for_reauthentication (GdmClient           *client,
                                      GAsyncResult        *result,
-                                     GSimpleAsyncResult  *operation_result)
+                                     GTask               *task)
 {
         GCancellable *cancellable;
         char         *username;
         GError       *error;
 
         error = NULL;
-        if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result),
-                                                   &error)) {
-                g_simple_async_result_take_error (operation_result, error);
-                g_simple_async_result_complete_in_idle (operation_result);
-                g_object_unref (operation_result);
+        if (!g_task_propagate_boolean (G_TASK (result), &error)) {
+                g_task_return_error (task, error);
+                g_object_unref (task);
                 return;
         }
 
-        cancellable = g_object_get_data (G_OBJECT (operation_result), "cancellable");
-        username = g_object_get_data (G_OBJECT (operation_result), "username");
+        cancellable = g_task_get_cancellable (task);
+        username = g_object_get_data (G_OBJECT (task), "username");
         gdm_manager_call_open_reauthentication_channel (client->priv->manager,
                                                         username,
                                                         cancellable,
                                                         (GAsyncReadyCallback)
                                                         on_reauthentication_channel_opened,
-                                                        operation_result);
+                                                        task);
 
 }
 
@@ -457,7 +471,7 @@ gdm_client_open_connection_sync (GdmClient      *client,
 static void
 on_connected (GObject            *source_object,
               GAsyncResult       *result,
-              GSimpleAsyncResult *operation_result)
+              GTask              *task)
 {
         GDBusConnection *connection;
         GError *error;
@@ -465,78 +479,72 @@ on_connected (GObject            *source_object,
         error = NULL;
         connection = g_dbus_connection_new_for_address_finish (result, &error);
         if (!connection) {
-                g_simple_async_result_take_error (operation_result, error);
-                g_simple_async_result_complete_in_idle (operation_result);
-                g_object_unref (operation_result);
+                g_task_return_error (task, error);
+                g_object_unref (task);
                 return;
         }
 
-        g_simple_async_result_set_op_res_gpointer (operation_result,
-                                                   g_object_ref (connection),
-                                                   (GDestroyNotify)
-                                                   g_object_unref);
-        g_simple_async_result_complete_in_idle (operation_result);
-        g_object_unref (operation_result);
+        g_task_return_pointer (task,
+                               g_object_ref (connection),
+                               (GDestroyNotify) g_object_unref);
+        g_object_unref (task);
         g_object_unref (connection);
 }
 
 static void
 on_session_opened (GdmManager         *manager,
                    GAsyncResult       *result,
-                   GSimpleAsyncResult *operation_result)
+                   GTask              *task)
 {
         GdmClient *client;
         GCancellable     *cancellable;
         GError           *error;
 
-        client = GDM_CLIENT (g_async_result_get_source_object (G_ASYNC_RESULT (operation_result)));
+        client = GDM_CLIENT (g_async_result_get_source_object (G_ASYNC_RESULT (task)));
 
         error = NULL;
         if (!gdm_manager_call_open_session_finish (manager,
                                                    &client->priv->address,
                                                    result,
                                                    &error)) {
-                g_simple_async_result_take_error (operation_result, error);
-                g_simple_async_result_complete_in_idle (operation_result);
-                g_object_unref (operation_result);
+                g_task_return_error (task, error);
+                g_object_unref (task);
                 g_object_unref (client);
                 return;
         }
 
-        cancellable = g_object_get_data (G_OBJECT (operation_result), "cancellable");
+        cancellable = g_task_get_cancellable (task);
         g_dbus_connection_new_for_address (client->priv->address,
                                            G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT,
                                            NULL,
                                            cancellable,
                                            (GAsyncReadyCallback)
                                            on_connected,
-                                           operation_result);
+                                           task);
         g_object_unref (client);
 }
 
 static void
 on_got_manager_for_opening_connection (GdmClient           *client,
                                        GAsyncResult        *result,
-                                       GSimpleAsyncResult  *operation_result)
+                                       GTask               *task)
 {
         GCancellable *cancellable;
         GError       *error;
 
         error = NULL;
-        if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result),
-                                                   &error)) {
-                g_simple_async_result_take_error (operation_result, error);
-                g_simple_async_result_complete_in_idle (operation_result);
-                g_object_unref (operation_result);
+        if (!g_task_propagate_boolean (G_TASK (result), &error)) {
+                g_task_return_error (task, error);
+                g_object_unref (task);
                 return;
         }
 
-        cancellable = g_object_get_data (G_OBJECT (operation_result), "cancellable");
+        cancellable = g_task_get_cancellable (task);
         gdm_manager_call_open_session (client->priv->manager,
                                        cancellable,
                                        (GAsyncReadyCallback)
                                        on_session_opened,
-                                       operation_result);
+                                       task);
 }
 
 static void
@@ -549,11 +557,10 @@ finish_pending_opens (GdmClient *client,
          node != NULL;
          node = node->next) {
 
-        GSimpleAsyncResult *pending_result = node->data;
+        GTask *task = node->data;
 
-        g_simple_async_result_set_from_error (pending_result, error);
-        g_simple_async_result_complete_in_idle (pending_result);
-        g_object_unref (pending_result);
+        g_task_return_error (task, error);
+        g_object_unref (task);
     }
     g_clear_pointer (&client->priv->pending_opens,
                      (GDestroyNotify) g_list_free);
@@ -564,16 +571,18 @@ gdm_client_open_connection_finish (GdmClient      *client,
                                    GAsyncResult   *result,
                                    GError        **error)
 {
+        g_autoptr(GDBusConnection) connection = NULL;
+
         g_return_val_if_fail (GDM_IS_CLIENT (client), FALSE);
 
-        if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result),
-                                                   error)) {
-            finish_pending_opens (client, *error);
-            return FALSE;
+        connection = g_task_propagate_pointer (G_TASK (result), error);
+        if (connection == NULL) {
+                finish_pending_opens (client, *error);
+                return FALSE;
         }
 
         if (client->priv->connection == NULL) {
-                client->priv->connection = g_object_ref (g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result)));
+                client->priv->connection = g_steal_pointer (&connection);
         }
 
         finish_pending_opens (client, NULL);
@@ -586,27 +595,20 @@ gdm_client_open_connection (GdmClient           *client,
                             GAsyncReadyCallback  callback,
                             gpointer             user_data)
 {
-        GSimpleAsyncResult *operation_result;
+        GTask *task;
 
         g_return_if_fail (GDM_IS_CLIENT (client));
 
-        operation_result = g_simple_async_result_new (G_OBJECT (client),
-                                                      callback,
-                                                      user_data,
-                                                      gdm_client_open_connection);
-        g_simple_async_result_set_check_cancellable (operation_result, cancellable);
-
-        g_object_set_data (G_OBJECT (operation_result),
-                           "cancellable",
-                           cancellable);
+        task = g_task_new (G_OBJECT (client),
+                           cancellable,
+                           callback,
+                           user_data);
 
         if (client->priv->connection != NULL) {
-            g_simple_async_result_set_op_res_gpointer (operation_result,
-                                                       g_object_ref (client->priv->connection),
-                                                       (GDestroyNotify)
-                                                       g_object_unref);
-            g_simple_async_result_complete_in_idle (operation_result);
-            g_object_unref (operation_result);
+            g_task_return_pointer (task,
+                                   g_object_ref (client->priv->connection),
+                                   (GDestroyNotify) g_object_unref);
+            g_object_unref (task);
             return;
         }
 
@@ -615,10 +617,10 @@ gdm_client_open_connection (GdmClient           *client,
                          cancellable,
                          (GAsyncReadyCallback)
                          on_got_manager_for_opening_connection,
-                         operation_result);
+                         task);
         } else {
                 client->priv->pending_opens = g_list_prepend (client->priv->pending_opens,
-                                                              operation_result);
+                                                              task);
         }
 
 }
@@ -730,20 +732,16 @@ gdm_client_open_reauthentication_channel (GdmClient           *client,
                                           GAsyncReadyCallback  callback,
                                           gpointer             user_data)
 {
-        GSimpleAsyncResult *operation_result;
+        GTask *task;
 
         g_return_if_fail (GDM_IS_CLIENT (client));
 
-        operation_result = g_simple_async_result_new (G_OBJECT (client),
-                                                      callback,
-                                                      user_data,
-                                                      gdm_client_open_reauthentication_channel);
-        g_simple_async_result_set_check_cancellable (operation_result, cancellable);
-        g_object_set_data (G_OBJECT (operation_result),
-                           "cancellable",
-                           cancellable);
+        task = g_task_new (G_OBJECT (client),
+                           cancellable,
+                           callback,
+                           user_data);
 
-        g_object_set_data_full (G_OBJECT (operation_result),
+        g_object_set_data_full (G_OBJECT (task),
                                 "username",
                                 g_strdup (username),
                                 (GDestroyNotify)
@@ -753,7 +751,7 @@ gdm_client_open_reauthentication_channel (GdmClient           *client,
                      cancellable,
                      (GAsyncReadyCallback)
                      on_got_manager_for_reauthentication,
-                     operation_result);
+                     task);
 }
 
 /**
@@ -772,18 +770,9 @@ gdm_client_open_reauthentication_channel_finish (GdmClient       *client,
                                                  GAsyncResult    *result,
                                                  GError         **error)
 {
-        GdmUserVerifier *user_verifier;
-
         g_return_val_if_fail (GDM_IS_CLIENT (client), FALSE);
 
-        if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result),
-                                                   error)) {
-                return NULL;
-        }
-
-        user_verifier = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result));
-
-        return g_object_ref (user_verifier);
+        return g_task_propagate_pointer (G_TASK (result), error);
 }
 
 /**
@@ -870,20 +859,19 @@ gdm_client_get_user_verifier_sync (GdmClient     *client,
 static void
 on_connection_opened_for_user_verifier (GdmClient          *client,
                                         GAsyncResult       *result,
-                                        GSimpleAsyncResult *operation_result)
+                                        GTask              *task)
 {
         GCancellable *cancellable;
         GError       *error;
 
         error = NULL;
         if (!gdm_client_open_connection_finish (client, result, &error)) {
-                g_simple_async_result_take_error (operation_result, error);
-                g_simple_async_result_complete_in_idle (operation_result);
-                g_object_unref (operation_result);
+                g_task_return_error (task, error);
+                g_object_unref (task);
                 return;
         }
 
-        cancellable = g_object_get_data (G_OBJECT (operation_result), "cancellable");
+        cancellable = g_task_get_cancellable (task);
         gdm_user_verifier_proxy_new (client->priv->connection,
                                      G_DBUS_PROXY_FLAGS_NONE,
                                      NULL,
@@ -891,7 +879,7 @@ on_connection_opened_for_user_verifier (GdmClient          *client,
                                      cancellable,
                                      (GAsyncReadyCallback)
                                      on_user_verifier_proxy_created,
-                                     operation_result);
+                                     task);
 }
 
 /**
@@ -910,27 +898,20 @@ gdm_client_get_user_verifier (GdmClient           *client,
                               GAsyncReadyCallback  callback,
                               gpointer             user_data)
 {
-        GSimpleAsyncResult *operation_result;
+        GTask *task;
 
         g_return_if_fail (GDM_IS_CLIENT (client));
 
-        operation_result = g_simple_async_result_new (G_OBJECT (client),
-                                                      callback,
-                                                      user_data,
-                                                      gdm_client_get_user_verifier);
-        g_simple_async_result_set_check_cancellable (operation_result, cancellable);
-
-        g_object_set_data (G_OBJECT (operation_result),
-                           "cancellable",
-                           cancellable);
+        task = g_task_new (G_OBJECT (client),
+                           cancellable,
+                           callback,
+                           user_data);
 
         if (client->priv->user_verifier != NULL) {
-                g_simple_async_result_set_op_res_gpointer (operation_result,
-                                                           g_object_ref (client->priv->user_verifier),
-                                                           (GDestroyNotify)
-                                                           g_object_unref);
-                g_simple_async_result_complete_in_idle (operation_result);
-                g_object_unref (operation_result);
+                g_task_return_pointer (task,
+                                       g_object_ref (client->priv->user_verifier),
+                                       (GDestroyNotify) g_object_unref);
+                g_object_unref (task);
                 return;
         }
 
@@ -938,7 +919,7 @@ gdm_client_get_user_verifier (GdmClient           *client,
                                     cancellable,
                                     (GAsyncReadyCallback)
                                     on_connection_opened_for_user_verifier,
-                                    operation_result);
+                                    task);
 }
 
 /**
@@ -961,14 +942,12 @@ gdm_client_get_user_verifier_finish (GdmClient       *client,
 
         g_return_val_if_fail (GDM_IS_CLIENT (client), FALSE);
 
-        if (client->priv->user_verifier != NULL) {
+        if (client->priv->user_verifier != NULL)
                 return g_object_ref (client->priv->user_verifier);
-        } else if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result),
-                                                          error)) {
-                return NULL;
-        }
 
-        user_verifier = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result));
+        user_verifier = g_task_propagate_pointer (G_TASK (result), error);
+        if (user_verifier == NULL)
+                return NULL;
 
         client->priv->user_verifier = user_verifier;
 
@@ -986,7 +965,7 @@ gdm_client_get_user_verifier_finish (GdmClient       *client,
                            g_clear_object,
                            &client->priv->manager);
 
-        return g_object_ref (user_verifier);
+        return user_verifier;
 }
 
 /**
@@ -1032,25 +1011,22 @@ query_for_timed_login_requested_signal (GdmGreeter *greeter)
 static void
 on_greeter_proxy_created (GObject            *source,
                           GAsyncResult       *result,
-                          GSimpleAsyncResult *operation_result)
+                          GTask              *task)
 {
         GdmGreeter   *greeter;
         GError       *error = NULL;
 
         greeter = gdm_greeter_proxy_new_finish (result, &error);
         if (greeter == NULL) {
-                g_simple_async_result_take_error (operation_result, error);
-                g_simple_async_result_complete_in_idle (operation_result);
-                g_object_unref (operation_result);
+                g_task_return_error (task, error);
+                g_object_unref (task);
                 return;
         }
 
-        g_simple_async_result_set_op_res_gpointer (operation_result,
-                                                   greeter,
-                                                   (GDestroyNotify)
-                                                   g_object_unref);
-        g_simple_async_result_complete_in_idle (operation_result);
-        g_object_unref (operation_result);
+        g_task_return_pointer (task,
+                               greeter,
+                               (GDestroyNotify) g_object_unref);
+        g_object_unref (task);
 
         query_for_timed_login_requested_signal (greeter);
 }
@@ -1058,20 +1034,19 @@ on_greeter_proxy_created (GObject            *source,
 static void
 on_connection_opened_for_greeter (GdmClient          *client,
                                   GAsyncResult       *result,
-                                  GSimpleAsyncResult *operation_result)
+                                  GTask              *task)
 {
         GCancellable *cancellable;
         GError       *error;
 
         error = NULL;
         if (!gdm_client_open_connection_finish (client, result, &error)) {
-                g_simple_async_result_take_error (operation_result, error);
-                g_simple_async_result_complete_in_idle (operation_result);
-                g_object_unref (operation_result);
+                g_task_return_error (task, error);
+                g_object_unref (task);
                 return;
         }
 
-        cancellable = g_object_get_data (G_OBJECT (operation_result), "cancellable");
+        cancellable = g_task_get_cancellable (task);
         gdm_greeter_proxy_new (client->priv->connection,
                                G_DBUS_PROXY_FLAGS_NONE,
                                NULL,
@@ -1079,7 +1054,7 @@ on_connection_opened_for_greeter (GdmClient          *client,
                                cancellable,
                                (GAsyncReadyCallback)
                                on_greeter_proxy_created,
-                               operation_result);
+                               task);
 }
 
 /**
@@ -1098,27 +1073,20 @@ gdm_client_get_greeter (GdmClient           *client,
                         GAsyncReadyCallback  callback,
                         gpointer             user_data)
 {
-        GSimpleAsyncResult *operation_result;
+        GTask *task;
 
         g_return_if_fail (GDM_IS_CLIENT (client));
 
-        operation_result = g_simple_async_result_new (G_OBJECT (client),
-                                                      callback,
-                                                      user_data,
-                                                      gdm_client_get_greeter);
-        g_simple_async_result_set_check_cancellable (operation_result, cancellable);
-
-        g_object_set_data (G_OBJECT (operation_result),
-                           "cancellable",
-                           cancellable);
+        task = g_task_new (G_OBJECT (client),
+                           cancellable,
+                           callback,
+                           user_data);
 
         if (client->priv->greeter != NULL) {
-                g_simple_async_result_set_op_res_gpointer (operation_result,
-                                                           g_object_ref (client->priv->greeter),
-                                                           (GDestroyNotify)
-                                                           g_object_unref);
-                g_simple_async_result_complete_in_idle (operation_result);
-                g_object_unref (operation_result);
+                g_task_return_pointer (task,
+                                       g_object_ref (client->priv->greeter),
+                                       (GDestroyNotify) g_object_unref);
+                g_object_unref (task);
                 return;
         }
 
@@ -1126,7 +1094,7 @@ gdm_client_get_greeter (GdmClient           *client,
                                     cancellable,
                                     (GAsyncReadyCallback)
                                     on_connection_opened_for_greeter,
-                                    operation_result);
+                                    task);
 }
 
 /**
@@ -1149,14 +1117,12 @@ gdm_client_get_greeter_finish (GdmClient       *client,
 
         g_return_val_if_fail (GDM_IS_CLIENT (client), FALSE);
 
-        if (client->priv->greeter != NULL) {
+        if (client->priv->greeter != NULL)
                 return g_object_ref (client->priv->greeter);
-        } else if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result),
-                                                          error)) {
-                return NULL;
-        }
 
-        greeter = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result));
+        greeter = g_task_propagate_pointer (G_TASK (result), error);
+        if (greeter == NULL)
+                return NULL;
 
         client->priv->greeter = greeter;
 
@@ -1174,7 +1140,7 @@ gdm_client_get_greeter_finish (GdmClient       *client,
                            g_clear_object,
                            &client->priv->manager);
 
-        return g_object_ref (greeter);
+        return greeter;
 }
 
 /**
@@ -1232,44 +1198,40 @@ gdm_client_get_greeter_sync (GdmClient     *client,
 static void
 on_remote_greeter_proxy_created (GObject            *object,
                                  GAsyncResult       *result,
-                                 GSimpleAsyncResult *operation_result)
+                                 GTask              *task)
 {
         GdmRemoteGreeter *remote_greeter;
         GError           *error = NULL;
 
         remote_greeter = gdm_remote_greeter_proxy_new_finish (result, &error);
         if (remote_greeter == NULL) {
-                g_simple_async_result_take_error (operation_result, error);
-                g_simple_async_result_complete_in_idle (operation_result);
-                g_object_unref (operation_result);
+                g_task_return_error (task, error);
+                g_object_unref (task);
                 return;
         }
 
-        g_simple_async_result_set_op_res_gpointer (operation_result,
-                                                   remote_greeter,
-                                                   (GDestroyNotify)
-                                                   g_object_unref);
-        g_simple_async_result_complete_in_idle (operation_result);
-        g_object_unref (operation_result);
+        g_task_return_pointer (task,
+                               remote_greeter,
+                               (GDestroyNotify) g_object_unref);
+        g_object_unref (task);
 }
 
 static void
 on_connection_opened_for_remote_greeter (GdmClient          *client,
                                          GAsyncResult       *result,
-                                         GSimpleAsyncResult *operation_result)
+                                         GTask              *task)
 {
         GCancellable *cancellable;
         GError       *error;
 
         error = NULL;
         if (!gdm_client_open_connection_finish (client, result, &error)) {
-                g_simple_async_result_take_error (operation_result, error);
-                g_simple_async_result_complete_in_idle (operation_result);
-                g_object_unref (operation_result);
+                g_task_return_error (task, error);
+                g_object_unref (task);
                 return;
         }
 
-        cancellable = g_object_get_data (G_OBJECT (operation_result), "cancellable");
+        cancellable = g_task_get_cancellable (task);
         gdm_remote_greeter_proxy_new (client->priv->connection,
                                       G_DBUS_PROXY_FLAGS_NONE,
                                       NULL,
@@ -1277,7 +1239,7 @@ on_connection_opened_for_remote_greeter (GdmClient          *client,
                                       cancellable,
                                       (GAsyncReadyCallback)
                                       on_remote_greeter_proxy_created,
-                                      operation_result);
+                                      task);
 }
 
 /**
@@ -1296,27 +1258,20 @@ gdm_client_get_remote_greeter (GdmClient           *client,
                                GAsyncReadyCallback  callback,
                                gpointer             user_data)
 {
-        GSimpleAsyncResult *operation_result;
+        GTask *task;
 
         g_return_if_fail (GDM_IS_CLIENT (client));
 
-        operation_result = g_simple_async_result_new (G_OBJECT (client),
-                                                      callback,
-                                                      user_data,
-                                                      gdm_client_get_remote_greeter);
-        g_simple_async_result_set_check_cancellable (operation_result, cancellable);
-
-        g_object_set_data (G_OBJECT (operation_result),
-                           "cancellable",
-                           cancellable);
+        task = g_task_new (G_OBJECT (client),
+                           cancellable,
+                           callback,
+                           user_data);
 
         if (client->priv->remote_greeter != NULL) {
-                g_simple_async_result_set_op_res_gpointer (operation_result,
-                                                           g_object_ref (client->priv->remote_greeter),
-                                                           (GDestroyNotify)
-                                                           g_object_unref);
-                g_simple_async_result_complete_in_idle (operation_result);
-                g_object_unref (operation_result);
+                g_task_return_pointer (task,
+                                       g_object_ref (client->priv->remote_greeter),
+                                       (GDestroyNotify) g_object_unref);
+                g_object_unref (task);
                 return;
         }
 
@@ -1324,7 +1279,7 @@ gdm_client_get_remote_greeter (GdmClient           *client,
                                     cancellable,
                                     (GAsyncReadyCallback)
                                     on_connection_opened_for_remote_greeter,
-                                    operation_result);
+                                    task);
 }
 
 /**
@@ -1347,14 +1302,12 @@ gdm_client_get_remote_greeter_finish (GdmClient     *client,
 
         g_return_val_if_fail (GDM_IS_CLIENT (client), FALSE);
 
-        if (client->priv->remote_greeter != NULL) {
+        if (client->priv->remote_greeter != NULL)
                 return g_object_ref (client->priv->remote_greeter);
-        } else if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result),
-                                                          error)) {
-                return NULL;
-        }
 
-        remote_greeter = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result));
+        remote_greeter = g_task_propagate_pointer (G_TASK (result), error);
+        if (remote_greeter == NULL)
+                return NULL;
 
         client->priv->remote_greeter = remote_greeter;
 
@@ -1372,7 +1325,7 @@ gdm_client_get_remote_greeter_finish (GdmClient     *client,
                            g_clear_object,
                            &client->priv->manager);
 
-        return g_object_ref (remote_greeter);
+        return remote_greeter;
 }
 
 /**
@@ -1427,44 +1380,40 @@ gdm_client_get_remote_greeter_sync (GdmClient     *client,
 static void
 on_chooser_proxy_created (GObject            *source,
                           GAsyncResult       *result,
-                          GSimpleAsyncResult *operation_result)
+                          GTask              *task)
 {
         GdmChooser   *chooser;
         GError       *error = NULL;
 
         chooser = gdm_chooser_proxy_new_finish (result, &error);
         if (chooser == NULL) {
-                g_simple_async_result_take_error (operation_result, error);
-                g_simple_async_result_complete_in_idle (operation_result);
-                g_object_unref (operation_result);
+                g_task_return_error (task, error);
+                g_object_unref (task);
                 return;
         }
 
-        g_simple_async_result_set_op_res_gpointer (operation_result,
-                                                   chooser,
-                                                   (GDestroyNotify)
-                                                   g_object_unref);
-        g_simple_async_result_complete_in_idle (operation_result);
-        g_object_unref (operation_result);
+        g_task_return_pointer (task,
+                               chooser,
+                               (GDestroyNotify) g_object_unref);
+        g_object_unref (task);
 }
 
 static void
 on_connection_opened_for_chooser (GdmClient          *client,
                                   GAsyncResult       *result,
-                                  GSimpleAsyncResult *operation_result)
+                                  GTask              *task)
 {
         GCancellable *cancellable;
         GError       *error;
 
         error = NULL;
         if (!gdm_client_open_connection_finish (client, result, &error)) {
-                g_simple_async_result_take_error (operation_result, error);
-                g_simple_async_result_complete_in_idle (operation_result);
-                g_object_unref (operation_result);
+                g_task_return_error (task, error);
+                g_object_unref (task);
                 return;
         }
 
-        cancellable = g_object_get_data (G_OBJECT (operation_result), "cancellable");
+        cancellable = g_task_get_cancellable (task);
         gdm_chooser_proxy_new (client->priv->connection,
                                G_DBUS_PROXY_FLAGS_NONE,
                                NULL,
@@ -1472,7 +1421,7 @@ on_connection_opened_for_chooser (GdmClient          *client,
                                cancellable,
                                (GAsyncReadyCallback)
                                on_chooser_proxy_created,
-                               operation_result);
+                               task);
 }
 
 /**
@@ -1491,27 +1440,20 @@ gdm_client_get_chooser (GdmClient           *client,
                         GAsyncReadyCallback  callback,
                         gpointer             user_data)
 {
-        GSimpleAsyncResult *operation_result;
+        GTask *task;
 
         g_return_if_fail (GDM_IS_CLIENT (client));
 
-        operation_result = g_simple_async_result_new (G_OBJECT (client),
-                                                      callback,
-                                                      user_data,
-                                                      gdm_client_get_chooser);
-        g_simple_async_result_set_check_cancellable (operation_result, cancellable);
-
-        g_object_set_data (G_OBJECT (operation_result),
-                           "cancellable",
-                           cancellable);
+        task = g_task_new (G_OBJECT (client),
+                           cancellable,
+                           callback,
+                           user_data);
 
         if (client->priv->chooser != NULL) {
-                g_simple_async_result_set_op_res_gpointer (operation_result,
-                                                           g_object_ref (client->priv->chooser),
-                                                           (GDestroyNotify)
-                                                           g_object_unref);
-                g_simple_async_result_complete_in_idle (operation_result);
-                g_object_unref (operation_result);
+                g_task_return_pointer (task,
+                                       g_object_ref (client->priv->chooser),
+                                       (GDestroyNotify) g_object_unref);
+                g_object_unref (task);
                 return;
         }
 
@@ -1519,7 +1461,7 @@ gdm_client_get_chooser (GdmClient           *client,
                                     cancellable,
                                     (GAsyncReadyCallback)
                                     on_connection_opened_for_chooser,
-                                    operation_result);
+                                    task);
 }
 
 /**
@@ -1542,14 +1484,12 @@ gdm_client_get_chooser_finish (GdmClient       *client,
 
         g_return_val_if_fail (GDM_IS_CLIENT (client), FALSE);
 
-        if (client->priv->chooser != NULL) {
+        if (client->priv->chooser != NULL)
                 return g_object_ref (client->priv->chooser);
-        } else if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result),
-                                                          error)) {
-                return NULL;
-        }
 
-        chooser = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result));
+        chooser = g_task_propagate_pointer (G_TASK (result), error);
+        if (chooser == NULL)
+                return NULL;
 
         client->priv->chooser = chooser;
 
@@ -1567,7 +1507,7 @@ gdm_client_get_chooser_finish (GdmClient       *client,
                            g_clear_object,
                            &client->priv->manager);
 
-        return g_object_ref (chooser);
+        return chooser;
 }
 
 /**
@@ -1711,5 +1651,4 @@ gdm_client_set_enabled_extensions (GdmClient          *client,
                                    const char * const *extensions)
 {
         client->priv->enabled_extensions = g_strdupv ((char **) extensions);
-
 }
-- 
2.24.1


From 463aa1c3f35f3d686f1036dabd6f3d963a52fd33 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= <mail@3v1n0.net>
Date: Wed, 9 May 2018 15:43:27 +0100
Subject: [PATCH 03/10] libgdm: Don't unref a connection that's in use

If an async task tries to reuse an open connection,
it erroneously explicitly unrefs it. That is incorrect,
because there are weak references in use to handle
disposing the connection when its no longer in use.

This commit makes sure the local connection object
in open_connection is nullified so the connection
doesn't get autofree'd.

https://bugzilla.gnome.org/show_bug.cgi?id=795940
---
 libgdm/gdm-client.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/libgdm/gdm-client.c b/libgdm/gdm-client.c
index bcae8ba..c017bf8 100644
--- a/libgdm/gdm-client.c
+++ b/libgdm/gdm-client.c
@@ -583,6 +583,8 @@ gdm_client_open_connection_finish (GdmClient      *client,
 
         if (client->priv->connection == NULL) {
                 client->priv->connection = g_steal_pointer (&connection);
+        } else if (client->priv->connection == connection) {
+                connection = NULL;
         }
 
         finish_pending_opens (client, NULL);
-- 
2.24.1


From 1dd46a7e864038af87600140c06a8976d7160f67 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= <mail@3v1n0.net>
Date: Wed, 9 May 2018 15:43:27 +0100
Subject: [PATCH 04/10] libgdm: add weak pointer for connection object

At the moment we fail to nullify GdmClient's
connection to GDM when the connection is disposed.

This commit adds a weak pointer to correct that mistake.

https://bugzilla.gnome.org/show_bug.cgi?id=795940
---
 libgdm/gdm-client.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/libgdm/gdm-client.c b/libgdm/gdm-client.c
index c017bf8..b5f3530 100644
--- a/libgdm/gdm-client.c
+++ b/libgdm/gdm-client.c
@@ -460,6 +460,10 @@ gdm_client_open_connection_sync (GdmClient      *client,
                         g_clear_pointer (&client->priv->address, g_free);
                         goto out;
                 }
+
+                g_object_add_weak_pointer (G_OBJECT (client->priv->connection),
+                                           (gpointer *)
+                                           &client->priv->connection);
         } else {
                 client->priv->connection = g_object_ref (client->priv->connection);
         }
@@ -583,6 +587,8 @@ gdm_client_open_connection_finish (GdmClient      *client,
 
         if (client->priv->connection == NULL) {
                 client->priv->connection = g_steal_pointer (&connection);
+                g_object_add_weak_pointer (G_OBJECT (client->priv->connection),
+                                           (gpointer *) &client->priv->connection);
         } else if (client->priv->connection == connection) {
                 connection = NULL;
         }
@@ -1616,6 +1622,12 @@ gdm_client_finalize (GObject *object)
                                               &client->priv->chooser);
         }
 
+        if (client->priv->connection != NULL) {
+                g_object_remove_weak_pointer (G_OBJECT (client->priv->connection),
+                                              (gpointer *)
+                                              &client->priv->connection);
+        }
+
         g_clear_object (&client->priv->manager);
         g_clear_object (&client->priv->connection);
 
-- 
2.24.1


From 539c76cbc72d56a51941ea8a9246c095ef53e212 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Mon, 14 May 2018 14:48:31 -0400
Subject: [PATCH 05/10] libgdm: drop support for serializing multiple opens

Right now libgdm tries to handle multiple simultaneous
open calls at the same time by serializing the requests
and giving them all the same connection.  It's broken,
though.

  - The pending_opens list is never populated, so we
    end up just doing multiple simultaneous open
    operations at a time anyway.
  - The finish code ends up calling
    g_task_return_error (task, NULL) instead of
    g_task_return_pointer in the non-error case.

Since the feature doesn't work, drop it for now.

https://bugzilla.gnome.org/show_bug.cgi?id=795940
---
 libgdm/gdm-client.c | 111 ++++++++++++++++----------------------------
 1 file changed, 40 insertions(+), 71 deletions(-)

diff --git a/libgdm/gdm-client.c b/libgdm/gdm-client.c
index b5f3530..61bcbd3 100644
--- a/libgdm/gdm-client.c
+++ b/libgdm/gdm-client.c
@@ -51,7 +51,6 @@ struct GdmClientPrivate
         GDBusConnection    *connection;
         char               *address;
 
-        GList              *pending_opens;
         char              **enabled_extensions;
 };
 
@@ -421,53 +420,50 @@ gdm_client_open_connection_sync (GdmClient      *client,
 
         g_return_val_if_fail (GDM_IS_CLIENT (client), FALSE);
 
-        if (client->priv->manager == NULL) {
-                client->priv->manager = gdm_manager_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
-                                                                            G_DBUS_PROXY_FLAGS_NONE,
-                                                                            "org.gnome.DisplayManager",
-                                                                            "/org/gnome/DisplayManager/Manager",
-                                                                            cancellable,
-                                                                            error);
-
-                if (client->priv->manager == NULL) {
-                        goto out;
-                }
-        } else {
-                client->priv->manager = g_object_ref (client->priv->manager);
+        if (client->priv->connection != NULL) {
+                g_object_ref (client->priv->connection);
+                return TRUE;
         }
 
-        if (client->priv->connection == NULL) {
-                ret = gdm_manager_call_open_session_sync (client->priv->manager,
-                                                          &client->priv->address,
-                                                          cancellable,
-                                                          error);
+        client->priv->manager = gdm_manager_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
+                                                                    G_DBUS_PROXY_FLAGS_NONE,
+                                                                    "org.gnome.DisplayManager",
+                                                                    "/org/gnome/DisplayManager/Manager",
+                                                                    cancellable,
+                                                                    error);
 
-                if (!ret) {
-                        g_clear_object (&client->priv->manager);
-                        goto out;
-                }
+        if (client->priv->manager == NULL) {
+                goto out;
+        }
 
-                g_debug ("GdmClient: connecting to address: %s", client->priv->address);
+        ret = gdm_manager_call_open_session_sync (client->priv->manager,
+                                                  &client->priv->address,
+                                                  cancellable,
+                                                  error);
 
-                client->priv->connection = g_dbus_connection_new_for_address_sync (client->priv->address,
-                                                                                   G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT,
-                                                                                   NULL,
-                                                                                   cancellable,
-                                                                                   error);
+        if (!ret) {
+                g_clear_object (&client->priv->manager);
+                goto out;
+        }
 
-                if (client->priv->connection == NULL) {
-                        g_clear_object (&client->priv->manager);
-                        g_clear_pointer (&client->priv->address, g_free);
-                        goto out;
-                }
+        g_debug ("GdmClient: connecting to address: %s", client->priv->address);
 
-                g_object_add_weak_pointer (G_OBJECT (client->priv->connection),
-                                           (gpointer *)
-                                           &client->priv->connection);
-        } else {
-                client->priv->connection = g_object_ref (client->priv->connection);
+        client->priv->connection = g_dbus_connection_new_for_address_sync (client->priv->address,
+                                                                           G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT,
+                                                                           NULL,
+                                                                           cancellable,
+                                                                           error);
+
+        if (client->priv->connection == NULL) {
+                g_clear_object (&client->priv->manager);
+                g_clear_pointer (&client->priv->address, g_free);
+                goto out;
         }
 
+        g_object_add_weak_pointer (G_OBJECT (client->priv->connection),
+                                   (gpointer *)
+                                   &client->priv->connection);
+
  out:
         return client->priv->connection != NULL;
 }
@@ -551,25 +547,6 @@ on_got_manager_for_opening_connection (GdmClient           *client,
                                        task);
 }
 
-static void
-finish_pending_opens (GdmClient *client,
-                      GError    *error)
-{
-    GList *node;
-
-    for (node = client->priv->pending_opens;
-         node != NULL;
-         node = node->next) {
-
-        GTask *task = node->data;
-
-        g_task_return_error (task, error);
-        g_object_unref (task);
-    }
-    g_clear_pointer (&client->priv->pending_opens,
-                     (GDestroyNotify) g_list_free);
-}
-
 static gboolean
 gdm_client_open_connection_finish (GdmClient      *client,
                                    GAsyncResult   *result,
@@ -581,7 +558,6 @@ gdm_client_open_connection_finish (GdmClient      *client,
 
         connection = g_task_propagate_pointer (G_TASK (result), error);
         if (connection == NULL) {
-                finish_pending_opens (client, *error);
                 return FALSE;
         }
 
@@ -593,7 +569,6 @@ gdm_client_open_connection_finish (GdmClient      *client,
                 connection = NULL;
         }
 
-        finish_pending_opens (client, NULL);
         return TRUE;
 }
 
@@ -620,17 +595,11 @@ gdm_client_open_connection (GdmClient           *client,
             return;
         }
 
-        if (client->priv->pending_opens == NULL) {
-            get_manager (client,
-                         cancellable,
-                         (GAsyncReadyCallback)
-                         on_got_manager_for_opening_connection,
-                         task);
-        } else {
-                client->priv->pending_opens = g_list_prepend (client->priv->pending_opens,
-                                                              task);
-        }
-
+        get_manager (client,
+                     cancellable,
+                     (GAsyncReadyCallback)
+                     on_got_manager_for_opening_connection,
+                     task);
 }
 
 /**
-- 
2.24.1


From 5e2eb40f69b7171073b4a1edac593e6fb4535667 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Mon, 14 May 2018 15:49:50 -0400
Subject: [PATCH 06/10] libgdm: fix pointer/boolean task confusion

The manager fetching code in GdmClient treats its task
return value as boolean, but it's actually a pointer (the manager)

This commit corrects the confusion.

https://bugzilla.gnome.org/show_bug.cgi?id=795940
---
 libgdm/gdm-client.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/libgdm/gdm-client.c b/libgdm/gdm-client.c
index 61bcbd3..a4a0e28 100644
--- a/libgdm/gdm-client.c
+++ b/libgdm/gdm-client.c
@@ -390,11 +390,13 @@ on_got_manager_for_reauthentication (GdmClient           *client,
                                      GTask               *task)
 {
         GCancellable *cancellable;
+        GdmManager   *manager;
         char         *username;
         GError       *error;
 
         error = NULL;
-        if (!g_task_propagate_boolean (G_TASK (result), &error)) {
+        manager = g_task_propagate_pointer (G_TASK (result), &error);
+        if (manager == NULL) {
                 g_task_return_error (task, error);
                 g_object_unref (task);
                 return;
@@ -530,10 +532,12 @@ on_got_manager_for_opening_connection (GdmClient           *client,
                                        GTask               *task)
 {
         GCancellable *cancellable;
+        GdmManager   *manager;
         GError       *error;
 
         error = NULL;
-        if (!g_task_propagate_boolean (G_TASK (result), &error)) {
+        manager = g_task_propagate_pointer (G_TASK (result), &error);
+        if (manager == NULL) {
                 g_task_return_error (task, error);
                 g_object_unref (task);
                 return;
-- 
2.24.1


From 269d33cd47734299f50eb0d3a410795a7cd0a357 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Mon, 14 May 2018 15:57:14 -0400
Subject: [PATCH 07/10] libgdm: don't keep manager proxy around longer than we
 need it
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Right now we keep the manager proxy alive long after we need it.
It doesn't get cleared until one of the other proxies go away.

That is not only unnecessary but illogical and confusing.

This commit changes the manager proxy to be transient—only alive
long enough to get what we need from it.

https://bugzilla.gnome.org/show_bug.cgi?id=795940
---
 libgdm/gdm-client.c | 119 ++++++++++----------------------------------
 1 file changed, 26 insertions(+), 93 deletions(-)

diff --git a/libgdm/gdm-client.c b/libgdm/gdm-client.c
index a4a0e28..c34121e 100644
--- a/libgdm/gdm-client.c
+++ b/libgdm/gdm-client.c
@@ -40,8 +40,6 @@
 
 struct GdmClientPrivate
 {
-        GdmManager         *manager;
-
         GdmUserVerifier    *user_verifier;
         GHashTable         *user_verifier_extensions;
 
@@ -74,34 +72,24 @@ gdm_client_error_quark (void)
 }
 
 static void
-on_got_manager (GdmManager          *manager,
+on_got_manager (GObject             *object,
                 GAsyncResult        *result,
                 GTask               *task)
 {
         GdmClient *client;
-        GdmManager       *new_manager;
-        GError           *error;
+        GError    *error;
+        g_autoptr(GdmManager) manager = NULL;
 
         client = GDM_CLIENT (g_async_result_get_source_object (G_ASYNC_RESULT (task)));
 
         error = NULL;
-        new_manager = gdm_manager_proxy_new_finish (result, &error);
-
-        if (client->priv->manager == NULL) {
-                client->priv->manager = new_manager;
-
-        } else {
-                g_object_ref (client->priv->manager);
-                g_object_unref (new_manager);
-
-                g_clear_error (&error);
-        }
+        manager = gdm_manager_proxy_new_finish (result, &error);
 
         if (error != NULL) {
                 g_task_return_error (task, error);
         } else {
                 g_task_return_pointer (task,
-                                       g_object_ref (client->priv->manager),
+                                       g_object_ref (manager),
                                        (GDestroyNotify) g_object_unref);
         }
 
@@ -122,14 +110,6 @@ get_manager (GdmClient           *client,
                            callback,
                            user_data);
 
-        if (client->priv->manager != NULL) {
-                g_task_return_pointer (task,
-                                       g_object_ref (client->priv->manager),
-                                       (GDestroyNotify) g_object_unref);
-                g_object_unref (task);
-                return;
-        }
-
         gdm_manager_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
                                        G_DBUS_PROXY_FLAGS_NONE,
                                        "org.gnome.DisplayManager",
@@ -404,7 +384,7 @@ on_got_manager_for_reauthentication (GdmClient           *client,
 
         cancellable = g_task_get_cancellable (task);
         username = g_object_get_data (G_OBJECT (task), "username");
-        gdm_manager_call_open_reauthentication_channel (client->priv->manager,
+        gdm_manager_call_open_reauthentication_channel (manager,
                                                         username,
                                                         cancellable,
                                                         (GAsyncReadyCallback)
@@ -418,6 +398,7 @@ gdm_client_open_connection_sync (GdmClient      *client,
                                  GCancellable   *cancellable,
                                  GError        **error)
 {
+        g_autoptr(GdmManager) manager = NULL;
         gboolean ret;
 
         g_return_val_if_fail (GDM_IS_CLIENT (client), FALSE);
@@ -427,24 +408,23 @@ gdm_client_open_connection_sync (GdmClient      *client,
                 return TRUE;
         }
 
-        client->priv->manager = gdm_manager_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
-                                                                    G_DBUS_PROXY_FLAGS_NONE,
-                                                                    "org.gnome.DisplayManager",
-                                                                    "/org/gnome/DisplayManager/Manager",
-                                                                    cancellable,
-                                                                    error);
+        manager = gdm_manager_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
+                                                      G_DBUS_PROXY_FLAGS_NONE,
+                                                      "org.gnome.DisplayManager",
+                                                      "/org/gnome/DisplayManager/Manager",
+                                                      cancellable,
+                                                      error);
 
-        if (client->priv->manager == NULL) {
+        if (manager == NULL) {
                 goto out;
         }
 
-        ret = gdm_manager_call_open_session_sync (client->priv->manager,
+        ret = gdm_manager_call_open_session_sync (manager,
                                                   &client->priv->address,
                                                   cancellable,
                                                   error);
 
         if (!ret) {
-                g_clear_object (&client->priv->manager);
                 goto out;
         }
 
@@ -457,7 +437,6 @@ gdm_client_open_connection_sync (GdmClient      *client,
                                                                            error);
 
         if (client->priv->connection == NULL) {
-                g_clear_object (&client->priv->manager);
                 g_clear_pointer (&client->priv->address, g_free);
                 goto out;
         }
@@ -544,7 +523,7 @@ on_got_manager_for_opening_connection (GdmClient           *client,
         }
 
         cancellable = g_task_get_cancellable (task);
-        gdm_manager_call_open_session (client->priv->manager,
+        gdm_manager_call_open_session (manager,
                                        cancellable,
                                        (GAsyncReadyCallback)
                                        on_session_opened,
@@ -627,28 +606,25 @@ gdm_client_open_reauthentication_channel_sync (GdmClient     *client,
                                                GError       **error)
 {
         GDBusConnection *connection;
+        g_autoptr(GdmManager) manager = NULL;
         GdmUserVerifier *user_verifier = NULL;
         gboolean         ret;
         char            *address;
 
         g_return_val_if_fail (GDM_IS_CLIENT (client), FALSE);
 
-        if (client->priv->manager == NULL) {
-                client->priv->manager = gdm_manager_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
-                                                                            G_DBUS_PROXY_FLAGS_NONE,
-                                                                            "org.gnome.DisplayManager",
-                                                                            "/org/gnome/DisplayManager/Manager",
-                                                                            cancellable,
-                                                                            error);
+        manager = gdm_manager_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
+                                                      G_DBUS_PROXY_FLAGS_NONE,
+                                                      "org.gnome.DisplayManager",
+                                                      "/org/gnome/DisplayManager/Manager",
+                                                      cancellable,
+                                                      error);
 
-                if (client->priv->manager == NULL) {
-                        goto out;
-                }
-        } else {
-                client->priv->manager = g_object_ref (client->priv->manager);
+        if (manager == NULL) {
+                goto out;
         }
 
-        ret = gdm_manager_call_open_reauthentication_channel_sync (client->priv->manager,
+        ret = gdm_manager_call_open_reauthentication_channel_sync (manager,
                                                                    username,
                                                                    &address,
                                                                    cancellable,
@@ -684,11 +660,6 @@ gdm_client_open_reauthentication_channel_sync (GdmClient     *client,
                                    (GWeakNotify)
                                    g_object_unref,
                                    connection);
-
-                g_object_weak_ref (G_OBJECT (user_verifier),
-                                   (GWeakNotify)
-                                   g_clear_object,
-                                   &client->priv->manager);
         }
 
  out:
@@ -791,10 +762,6 @@ gdm_client_get_user_verifier_sync (GdmClient     *client,
                 g_object_add_weak_pointer (G_OBJECT (client->priv->user_verifier),
                                            (gpointer *)
                                            &client->priv->user_verifier);
-                g_object_weak_ref (G_OBJECT (client->priv->user_verifier),
-                                   (GWeakNotify)
-                                   g_clear_object,
-                                   &client->priv->manager);
                 g_object_weak_ref (G_OBJECT (client->priv->user_verifier),
                                    (GWeakNotify)
                                    g_clear_object,
@@ -941,11 +908,6 @@ gdm_client_get_user_verifier_finish (GdmClient       *client,
                            g_object_unref,
                            client->priv->connection);
 
-        g_object_weak_ref (G_OBJECT (client->priv->user_verifier),
-                           (GWeakNotify)
-                           g_clear_object,
-                           &client->priv->manager);
-
         return user_verifier;
 }
 
@@ -1115,12 +1077,6 @@ gdm_client_get_greeter_finish (GdmClient       *client,
                            (GWeakNotify)
                            g_object_unref,
                            client->priv->connection);
-
-        g_object_weak_ref (G_OBJECT (client->priv->greeter),
-                           (GWeakNotify)
-                           g_clear_object,
-                           &client->priv->manager);
-
         return greeter;
 }
 
@@ -1161,10 +1117,6 @@ gdm_client_get_greeter_sync (GdmClient     *client,
                 g_object_add_weak_pointer (G_OBJECT (client->priv->greeter),
                                            (gpointer *)
                                            &client->priv->greeter);
-                g_object_weak_ref (G_OBJECT (client->priv->greeter),
-                                   (GWeakNotify)
-                                   g_clear_object,
-                                   &client->priv->manager);
                 g_object_weak_ref (G_OBJECT (client->priv->greeter),
                                    (GWeakNotify)
                                    g_clear_object,
@@ -1301,11 +1253,6 @@ gdm_client_get_remote_greeter_finish (GdmClient     *client,
                            g_object_unref,
                            client->priv->connection);
 
-        g_object_weak_ref (G_OBJECT (client->priv->remote_greeter),
-                           (GWeakNotify)
-                           g_clear_object,
-                           &client->priv->manager);
-
         return remote_greeter;
 }
 
@@ -1345,10 +1292,6 @@ gdm_client_get_remote_greeter_sync (GdmClient     *client,
                 g_object_add_weak_pointer (G_OBJECT (client->priv->remote_greeter),
                                            (gpointer *)
                                            &client->priv->remote_greeter);
-                g_object_weak_ref (G_OBJECT (client->priv->remote_greeter),
-                                   (GWeakNotify)
-                                   g_clear_object,
-                                   &client->priv->manager);
                 g_object_weak_ref (G_OBJECT (client->priv->remote_greeter),
                                    (GWeakNotify)
                                    g_clear_object,
@@ -1483,11 +1426,6 @@ gdm_client_get_chooser_finish (GdmClient       *client,
                            g_object_unref,
                            client->priv->connection);
 
-        g_object_weak_ref (G_OBJECT (client->priv->chooser),
-                           (GWeakNotify)
-                           g_clear_object,
-                           &client->priv->manager);
-
         return chooser;
 }
 
@@ -1528,10 +1466,6 @@ gdm_client_get_chooser_sync (GdmClient     *client,
                 g_object_add_weak_pointer (G_OBJECT (client->priv->chooser),
                                            (gpointer *)
                                            &client->priv->chooser);
-                g_object_weak_ref (G_OBJECT (client->priv->chooser),
-                                   (GWeakNotify)
-                                   g_clear_object,
-                                   &client->priv->manager);
                 g_object_weak_ref (G_OBJECT (client->priv->chooser),
                                    (GWeakNotify)
                                    g_clear_object,
@@ -1601,7 +1535,6 @@ gdm_client_finalize (GObject *object)
                                               &client->priv->connection);
         }
 
-        g_clear_object (&client->priv->manager);
         g_clear_object (&client->priv->connection);
 
         g_strfreev (client->priv->enabled_extensions);
-- 
2.24.1


From c579b7ee311710a8cfb47f2d753183ff88c62dd8 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Tue, 15 May 2018 17:02:36 -0400
Subject: [PATCH 08/10] libgdm: use g_object_unref instead of g_clear_object
 for weakrefs

At the moment we add a weakref on each proxy to the connection
object.  For the _sync variant functions, When the weakref fires,
they call g_clear_object, clearing the connection, even if other
proxies still have a reference.

This commit changes that weak ref code to use g_object_unref instead.

https://bugzilla.gnome.org/show_bug.cgi?id=795940
---
 libgdm/gdm-client.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/libgdm/gdm-client.c b/libgdm/gdm-client.c
index c34121e..e02e3ea 100644
--- a/libgdm/gdm-client.c
+++ b/libgdm/gdm-client.c
@@ -764,8 +764,8 @@ gdm_client_get_user_verifier_sync (GdmClient     *client,
                                            &client->priv->user_verifier);
                 g_object_weak_ref (G_OBJECT (client->priv->user_verifier),
                                    (GWeakNotify)
-                                   g_clear_object,
-                                   &client->priv->connection);
+                                   g_object_unref,
+                                   client->priv->connection);
 
                 if (client->priv->enabled_extensions != NULL) {
                         gboolean res;
@@ -1119,8 +1119,8 @@ gdm_client_get_greeter_sync (GdmClient     *client,
                                            &client->priv->greeter);
                 g_object_weak_ref (G_OBJECT (client->priv->greeter),
                                    (GWeakNotify)
-                                   g_clear_object,
-                                   &client->priv->connection);
+                                   g_object_unref,
+                                   client->priv->connection);
 
                 query_for_timed_login_requested_signal (client->priv->greeter);
         }
@@ -1294,8 +1294,8 @@ gdm_client_get_remote_greeter_sync (GdmClient     *client,
                                            &client->priv->remote_greeter);
                 g_object_weak_ref (G_OBJECT (client->priv->remote_greeter),
                                    (GWeakNotify)
-                                   g_clear_object,
-                                   &client->priv->connection);
+                                   g_object_unref,
+                                   client->priv->connection);
         }
 
         return client->priv->remote_greeter;
@@ -1468,8 +1468,8 @@ gdm_client_get_chooser_sync (GdmClient     *client,
                                            &client->priv->chooser);
                 g_object_weak_ref (G_OBJECT (client->priv->chooser),
                                    (GWeakNotify)
-                                   g_clear_object,
-                                   &client->priv->connection);
+                                   g_object_unref,
+                                   client->priv->connection);
         }
 
         return client->priv->chooser;
-- 
2.24.1


From c83a952af7d327173231fd67c5f593baab9d50ee Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= <mail@3v1n0.net>
Date: Mon, 14 May 2018 16:32:25 -0400
Subject: [PATCH 09/10] libgdm: get connection explicitly

At the moment we call gdm_client_open_connection and when it finishes,
assume client->priv->connection is implicitly initialized.

This commit makes the operation more explicit by changing
gdm_client_open_connection to gdm_client_get_connection and returning
the GDBusConnection object directly, instead of returning a boolean.

https://bugzilla.gnome.org/show_bug.cgi?id=795940
---
 libgdm/gdm-client.c | 136 ++++++++++++++++++++++++++------------------
 1 file changed, 82 insertions(+), 54 deletions(-)

diff --git a/libgdm/gdm-client.c b/libgdm/gdm-client.c
index e02e3ea..e7b93e3 100644
--- a/libgdm/gdm-client.c
+++ b/libgdm/gdm-client.c
@@ -393,10 +393,10 @@ on_got_manager_for_reauthentication (GdmClient           *client,
 
 }
 
-static gboolean
-gdm_client_open_connection_sync (GdmClient      *client,
-                                 GCancellable   *cancellable,
-                                 GError        **error)
+static GDBusConnection *
+gdm_client_get_connection_sync (GdmClient      *client,
+                                GCancellable   *cancellable,
+                                GError        **error)
 {
         g_autoptr(GdmManager) manager = NULL;
         gboolean ret;
@@ -404,8 +404,7 @@ gdm_client_open_connection_sync (GdmClient      *client,
         g_return_val_if_fail (GDM_IS_CLIENT (client), FALSE);
 
         if (client->priv->connection != NULL) {
-                g_object_ref (client->priv->connection);
-                return TRUE;
+                return g_object_ref (client->priv->connection);
         }
 
         manager = gdm_manager_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
@@ -446,7 +445,7 @@ gdm_client_open_connection_sync (GdmClient      *client,
                                    &client->priv->connection);
 
  out:
-        return client->priv->connection != NULL;
+        return client->priv->connection;
 }
 
 static void
@@ -530,33 +529,31 @@ on_got_manager_for_opening_connection (GdmClient           *client,
                                        task);
 }
 
-static gboolean
-gdm_client_open_connection_finish (GdmClient      *client,
-                                   GAsyncResult   *result,
-                                   GError        **error)
+static GDBusConnection *
+gdm_client_get_connection_finish (GdmClient      *client,
+                                  GAsyncResult   *result,
+                                  GError        **error)
 {
-        g_autoptr(GDBusConnection) connection = NULL;
+        GDBusConnection *connection = NULL;
 
         g_return_val_if_fail (GDM_IS_CLIENT (client), FALSE);
 
         connection = g_task_propagate_pointer (G_TASK (result), error);
         if (connection == NULL) {
-                return FALSE;
+                return NULL;
         }
 
         if (client->priv->connection == NULL) {
-                client->priv->connection = g_steal_pointer (&connection);
+                client->priv->connection = connection;
                 g_object_add_weak_pointer (G_OBJECT (client->priv->connection),
                                            (gpointer *) &client->priv->connection);
-        } else if (client->priv->connection == connection) {
-                connection = NULL;
         }
 
-        return TRUE;
+        return g_object_ref (connection);
 }
 
 static void
-gdm_client_open_connection (GdmClient           *client,
+gdm_client_get_connection (GdmClient           *client,
                             GCancellable        *cancellable,
                             GAsyncReadyCallback  callback,
                             gpointer             user_data)
@@ -743,15 +740,19 @@ gdm_client_get_user_verifier_sync (GdmClient     *client,
                                    GCancellable  *cancellable,
                                    GError       **error)
 {
+        g_autoptr(GDBusConnection) connection = NULL;
+
         if (client->priv->user_verifier != NULL) {
                 return g_object_ref (client->priv->user_verifier);
         }
 
-        if (!gdm_client_open_connection_sync (client, cancellable, error)) {
+        connection = gdm_client_get_connection_sync (client, cancellable, error);
+
+        if (connection == NULL) {
                 return NULL;
         }
 
-        client->priv->user_verifier = gdm_user_verifier_proxy_new_sync (client->priv->connection,
+        client->priv->user_verifier = gdm_user_verifier_proxy_new_sync (connection,
                                                                         G_DBUS_PROXY_FLAGS_NONE,
                                                                         NULL,
                                                                         SESSION_DBUS_PATH,
@@ -762,6 +763,7 @@ gdm_client_get_user_verifier_sync (GdmClient     *client,
                 g_object_add_weak_pointer (G_OBJECT (client->priv->user_verifier),
                                            (gpointer *)
                                            &client->priv->user_verifier);
+                g_object_ref (connection);
                 g_object_weak_ref (G_OBJECT (client->priv->user_verifier),
                                    (GWeakNotify)
                                    g_object_unref,
@@ -805,22 +807,25 @@ gdm_client_get_user_verifier_sync (GdmClient     *client,
 }
 
 static void
-on_connection_opened_for_user_verifier (GdmClient          *client,
-                                        GAsyncResult       *result,
-                                        GTask              *task)
+on_connection_for_user_verifier (GdmClient          *client,
+                                 GAsyncResult       *result,
+                                 GTask              *task)
 {
+        g_autoptr(GDBusConnection) connection = NULL;
         GCancellable *cancellable;
         GError       *error;
 
         error = NULL;
-        if (!gdm_client_open_connection_finish (client, result, &error)) {
+        connection = gdm_client_get_connection_finish (client, result, &error);
+
+        if (connection == NULL) {
                 g_task_return_error (task, error);
                 g_object_unref (task);
                 return;
         }
 
         cancellable = g_task_get_cancellable (task);
-        gdm_user_verifier_proxy_new (client->priv->connection,
+        gdm_user_verifier_proxy_new (connection,
                                      G_DBUS_PROXY_FLAGS_NONE,
                                      NULL,
                                      SESSION_DBUS_PATH,
@@ -863,10 +868,10 @@ gdm_client_get_user_verifier (GdmClient           *client,
                 return;
         }
 
-        gdm_client_open_connection (client,
+        gdm_client_get_connection (client,
                                     cancellable,
                                     (GAsyncReadyCallback)
-                                    on_connection_opened_for_user_verifier,
+                                    on_connection_for_user_verifier,
                                     task);
 }
 
@@ -975,22 +980,25 @@ on_greeter_proxy_created (GObject            *source,
 }
 
 static void
-on_connection_opened_for_greeter (GdmClient          *client,
-                                  GAsyncResult       *result,
-                                  GTask              *task)
+on_connection_for_greeter (GdmClient          *client,
+                           GAsyncResult       *result,
+                           GTask              *task)
 {
+        g_autoptr(GDBusConnection) connection = NULL;
         GCancellable *cancellable;
         GError       *error;
 
         error = NULL;
-        if (!gdm_client_open_connection_finish (client, result, &error)) {
+        connection = gdm_client_get_connection_finish (client, result, &error);
+
+        if (connection == NULL) {
                 g_task_return_error (task, error);
                 g_object_unref (task);
                 return;
         }
 
         cancellable = g_task_get_cancellable (task);
-        gdm_greeter_proxy_new (client->priv->connection,
+        gdm_greeter_proxy_new (connection,
                                G_DBUS_PROXY_FLAGS_NONE,
                                NULL,
                                SESSION_DBUS_PATH,
@@ -1033,10 +1041,10 @@ gdm_client_get_greeter (GdmClient           *client,
                 return;
         }
 
-        gdm_client_open_connection (client,
+        gdm_client_get_connection (client,
                                     cancellable,
                                     (GAsyncReadyCallback)
-                                    on_connection_opened_for_greeter,
+                                    on_connection_for_greeter,
                                     task);
 }
 
@@ -1098,15 +1106,19 @@ gdm_client_get_greeter_sync (GdmClient     *client,
                              GCancellable  *cancellable,
                              GError       **error)
 {
+        g_autoptr(GDBusConnection) connection = NULL;
+
         if (client->priv->greeter != NULL) {
                 return g_object_ref (client->priv->greeter);
         }
 
-        if (!gdm_client_open_connection_sync (client, cancellable, error)) {
+        connection = gdm_client_get_connection_sync (client, cancellable, error);
+
+        if (connection == NULL) {
                 return NULL;
         }
 
-        client->priv->greeter = gdm_greeter_proxy_new_sync (client->priv->connection,
+        client->priv->greeter = gdm_greeter_proxy_new_sync (connection,
                                                             G_DBUS_PROXY_FLAGS_NONE,
                                                             NULL,
                                                             SESSION_DBUS_PATH,
@@ -1150,22 +1162,25 @@ on_remote_greeter_proxy_created (GObject            *object,
 }
 
 static void
-on_connection_opened_for_remote_greeter (GdmClient          *client,
-                                         GAsyncResult       *result,
-                                         GTask              *task)
+on_connection_for_remote_greeter (GdmClient          *client,
+                                  GAsyncResult       *result,
+                                  GTask              *task)
 {
+        g_autoptr(GDBusConnection) connection = NULL;
         GCancellable *cancellable;
         GError       *error;
 
         error = NULL;
-        if (!gdm_client_open_connection_finish (client, result, &error)) {
+        connection = gdm_client_get_connection_finish (client, result, &error);
+
+        if (connection == NULL) {
                 g_task_return_error (task, error);
                 g_object_unref (task);
                 return;
         }
 
         cancellable = g_task_get_cancellable (task);
-        gdm_remote_greeter_proxy_new (client->priv->connection,
+        gdm_remote_greeter_proxy_new (connection,
                                       G_DBUS_PROXY_FLAGS_NONE,
                                       NULL,
                                       SESSION_DBUS_PATH,
@@ -1208,10 +1223,10 @@ gdm_client_get_remote_greeter (GdmClient           *client,
                 return;
         }
 
-        gdm_client_open_connection (client,
+        gdm_client_get_connection (client,
                                     cancellable,
                                     (GAsyncReadyCallback)
-                                    on_connection_opened_for_remote_greeter,
+                                    on_connection_for_remote_greeter,
                                     task);
 }
 
@@ -1273,15 +1288,19 @@ gdm_client_get_remote_greeter_sync (GdmClient     *client,
                                     GCancellable  *cancellable,
                                     GError       **error)
 {
+        g_autoptr(GDBusConnection) connection = NULL;
+
         if (client->priv->remote_greeter != NULL) {
                 return g_object_ref (client->priv->remote_greeter);
         }
 
-        if (!gdm_client_open_connection_sync (client, cancellable, error)) {
+        connection = gdm_client_get_connection_sync (client, cancellable, error);
+
+        if (connection == NULL) {
                 return NULL;
         }
 
-        client->priv->remote_greeter = gdm_remote_greeter_proxy_new_sync (client->priv->connection,
+        client->priv->remote_greeter = gdm_remote_greeter_proxy_new_sync (connection,
                                                                           G_DBUS_PROXY_FLAGS_NONE,
                                                                           NULL,
                                                                           SESSION_DBUS_PATH,
@@ -1292,6 +1311,7 @@ gdm_client_get_remote_greeter_sync (GdmClient     *client,
                 g_object_add_weak_pointer (G_OBJECT (client->priv->remote_greeter),
                                            (gpointer *)
                                            &client->priv->remote_greeter);
+                g_object_ref (connection);
                 g_object_weak_ref (G_OBJECT (client->priv->remote_greeter),
                                    (GWeakNotify)
                                    g_object_unref,
@@ -1323,22 +1343,25 @@ on_chooser_proxy_created (GObject            *source,
 }
 
 static void
-on_connection_opened_for_chooser (GdmClient          *client,
-                                  GAsyncResult       *result,
-                                  GTask              *task)
+on_connection_for_chooser (GdmClient          *client,
+                           GAsyncResult       *result,
+                           GTask              *task)
 {
+        g_autoptr(GDBusConnection) connection = NULL;
         GCancellable *cancellable;
         GError       *error;
 
         error = NULL;
-        if (!gdm_client_open_connection_finish (client, result, &error)) {
+        connection = gdm_client_get_connection_finish (client, result, &error);
+
+        if (connection == NULL) {
                 g_task_return_error (task, error);
                 g_object_unref (task);
                 return;
         }
 
         cancellable = g_task_get_cancellable (task);
-        gdm_chooser_proxy_new (client->priv->connection,
+        gdm_chooser_proxy_new (connection,
                                G_DBUS_PROXY_FLAGS_NONE,
                                NULL,
                                SESSION_DBUS_PATH,
@@ -1381,10 +1404,10 @@ gdm_client_get_chooser (GdmClient           *client,
                 return;
         }
 
-        gdm_client_open_connection (client,
+        gdm_client_get_connection (client,
                                     cancellable,
                                     (GAsyncReadyCallback)
-                                    on_connection_opened_for_chooser,
+                                    on_connection_for_chooser,
                                     task);
 }
 
@@ -1421,6 +1444,7 @@ gdm_client_get_chooser_finish (GdmClient       *client,
                                    (gpointer *)
                                    &client->priv->chooser);
 
+        g_object_ref (connection);
         g_object_weak_ref (G_OBJECT (client->priv->chooser),
                            (GWeakNotify)
                            g_object_unref,
@@ -1446,16 +1470,19 @@ gdm_client_get_chooser_sync (GdmClient     *client,
                              GCancellable  *cancellable,
                              GError       **error)
 {
+        g_autoptr(GDBusConnection) connection = NULL;
 
         if (client->priv->chooser != NULL) {
                 return g_object_ref (client->priv->chooser);
         }
 
-        if (!gdm_client_open_connection_sync (client, cancellable, error)) {
+        connection = gdm_client_get_connection_sync (client, cancellable, error);
+
+        if (connection == NULL) {
                 return NULL;
         }
 
-        client->priv->chooser = gdm_chooser_proxy_new_sync (client->priv->connection,
+        client->priv->chooser = gdm_chooser_proxy_new_sync (connection,
                                                             G_DBUS_PROXY_FLAGS_NONE,
                                                             NULL,
                                                             SESSION_DBUS_PATH,
@@ -1466,6 +1493,7 @@ gdm_client_get_chooser_sync (GdmClient     *client,
                 g_object_add_weak_pointer (G_OBJECT (client->priv->chooser),
                                            (gpointer *)
                                            &client->priv->chooser);
+                g_object_ref (connection);
                 g_object_weak_ref (G_OBJECT (client->priv->chooser),
                                    (GWeakNotify)
                                    g_object_unref,
-- 
2.24.1


From f899910c500e0a298cecbd900983a62bc795f76d Mon Sep 17 00:00:00 2001
From: Iain Lane <iainl@gnome.org>
Date: Mon, 14 May 2018 16:32:25 -0400
Subject: [PATCH 10/10] libgdm: Drop weak refs on the GDBusConnection

The GDBusProxies hold a strong reference to the connection themselves,
so maintaining separate weak references is unnecessary.

This commit drops those extraneous weak references.

https://bugzilla.gnome.org/show_bug.cgi?id=795940
---
 libgdm/gdm-client.c | 47 ---------------------------------------------
 1 file changed, 47 deletions(-)

diff --git a/libgdm/gdm-client.c b/libgdm/gdm-client.c
index e7b93e3..f327344 100644
--- a/libgdm/gdm-client.c
+++ b/libgdm/gdm-client.c
@@ -652,13 +652,6 @@ gdm_client_open_reauthentication_channel_sync (GdmClient     *client,
                                                           cancellable,
                                                           error);
 
-        if (user_verifier != NULL) {
-                g_object_weak_ref (G_OBJECT (user_verifier),
-                                   (GWeakNotify)
-                                   g_object_unref,
-                                   connection);
-        }
-
  out:
         return user_verifier;
 }
@@ -763,12 +756,6 @@ gdm_client_get_user_verifier_sync (GdmClient     *client,
                 g_object_add_weak_pointer (G_OBJECT (client->priv->user_verifier),
                                            (gpointer *)
                                            &client->priv->user_verifier);
-                g_object_ref (connection);
-                g_object_weak_ref (G_OBJECT (client->priv->user_verifier),
-                                   (GWeakNotify)
-                                   g_object_unref,
-                                   client->priv->connection);
-
                 if (client->priv->enabled_extensions != NULL) {
                         gboolean res;
 
@@ -908,11 +895,6 @@ gdm_client_get_user_verifier_finish (GdmClient       *client,
                                    (gpointer *)
                                    &client->priv->user_verifier);
 
-        g_object_weak_ref (G_OBJECT (client->priv->user_verifier),
-                           (GWeakNotify)
-                           g_object_unref,
-                           client->priv->connection);
-
         return user_verifier;
 }
 
@@ -1081,10 +1063,6 @@ gdm_client_get_greeter_finish (GdmClient       *client,
                                    (gpointer *)
                                    &client->priv->greeter);
 
-        g_object_weak_ref (G_OBJECT (client->priv->greeter),
-                           (GWeakNotify)
-                           g_object_unref,
-                           client->priv->connection);
         return greeter;
 }
 
@@ -1129,10 +1107,6 @@ gdm_client_get_greeter_sync (GdmClient     *client,
                 g_object_add_weak_pointer (G_OBJECT (client->priv->greeter),
                                            (gpointer *)
                                            &client->priv->greeter);
-                g_object_weak_ref (G_OBJECT (client->priv->greeter),
-                                   (GWeakNotify)
-                                   g_object_unref,
-                                   client->priv->connection);
 
                 query_for_timed_login_requested_signal (client->priv->greeter);
         }
@@ -1263,11 +1237,6 @@ gdm_client_get_remote_greeter_finish (GdmClient     *client,
                                    (gpointer *)
                                    &client->priv->remote_greeter);
 
-        g_object_weak_ref (G_OBJECT (client->priv->remote_greeter),
-                           (GWeakNotify)
-                           g_object_unref,
-                           client->priv->connection);
-
         return remote_greeter;
 }
 
@@ -1311,11 +1280,6 @@ gdm_client_get_remote_greeter_sync (GdmClient     *client,
                 g_object_add_weak_pointer (G_OBJECT (client->priv->remote_greeter),
                                            (gpointer *)
                                            &client->priv->remote_greeter);
-                g_object_ref (connection);
-                g_object_weak_ref (G_OBJECT (client->priv->remote_greeter),
-                                   (GWeakNotify)
-                                   g_object_unref,
-                                   client->priv->connection);
         }
 
         return client->priv->remote_greeter;
@@ -1444,12 +1408,6 @@ gdm_client_get_chooser_finish (GdmClient       *client,
                                    (gpointer *)
                                    &client->priv->chooser);
 
-        g_object_ref (connection);
-        g_object_weak_ref (G_OBJECT (client->priv->chooser),
-                           (GWeakNotify)
-                           g_object_unref,
-                           client->priv->connection);
-
         return chooser;
 }
 
@@ -1493,11 +1451,6 @@ gdm_client_get_chooser_sync (GdmClient     *client,
                 g_object_add_weak_pointer (G_OBJECT (client->priv->chooser),
                                            (gpointer *)
                                            &client->priv->chooser);
-                g_object_ref (connection);
-                g_object_weak_ref (G_OBJECT (client->priv->chooser),
-                                   (GWeakNotify)
-                                   g_object_unref,
-                                   client->priv->connection);
         }
 
         return client->priv->chooser;
-- 
2.24.1

openSUSE Build Service is sponsored by