diff --git a/SOURCES/0001-libgdm-drop-support-for-serializing-multiple-opens.patch b/SOURCES/0001-libgdm-drop-support-for-serializing-multiple-opens.patch index 60b0e06..ee010df 100644 --- a/SOURCES/0001-libgdm-drop-support-for-serializing-multiple-opens.patch +++ b/SOURCES/0001-libgdm-drop-support-for-serializing-multiple-opens.patch @@ -378,5 +378,5 @@ index 58ede0aab..06dfe725e 100644 if (client->priv->manager == NULL) { -- -2.26.2 +2.25.1 diff --git a/SOURCES/0002-libgdm-don-t-keep-manager-proxy-around-longer-than-w.patch b/SOURCES/0002-libgdm-don-t-keep-manager-proxy-around-longer-than-w.patch index a5ae0d0..94ced1e 100644 --- a/SOURCES/0002-libgdm-don-t-keep-manager-proxy-around-longer-than-w.patch +++ b/SOURCES/0002-libgdm-don-t-keep-manager-proxy-around-longer-than-w.patch @@ -1025,5 +1025,5 @@ index 06dfe725e..e02e3ea57 100644 * Enables GDM's pam extensions. Currently, only * org.gnome.DisplayManager.UserVerifier.ChoiceList is supported. -- -2.26.2 +2.25.1 diff --git a/SOURCES/0003-libgdm-get-connection-explicitly.patch b/SOURCES/0003-libgdm-get-connection-explicitly.patch index 0dd2f44..8b3ed26 100644 --- a/SOURCES/0003-libgdm-get-connection-explicitly.patch +++ b/SOURCES/0003-libgdm-get-connection-explicitly.patch @@ -1042,5 +1042,5 @@ index e02e3ea57..e7b93e382 100644 gdm_client_finalize (GObject *object) { -- -2.26.2 +2.25.1 diff --git a/SOURCES/0004-libgdm-Drop-weak-refs-on-the-GDBusConnection.patch b/SOURCES/0004-libgdm-Drop-weak-refs-on-the-GDBusConnection.patch index 7886d0b..d1da17c 100644 --- a/SOURCES/0004-libgdm-Drop-weak-refs-on-the-GDBusConnection.patch +++ b/SOURCES/0004-libgdm-Drop-weak-refs-on-the-GDBusConnection.patch @@ -561,5 +561,5 @@ index e7b93e382..f327344ec 100644 g_return_if_fail (object != NULL); g_return_if_fail (GDM_IS_CLIENT (object)); -- -2.26.2 +2.25.1 diff --git a/SOURCES/0005-libgdm-Unref-the-manager-propagated-from-task.patch b/SOURCES/0005-libgdm-Unref-the-manager-propagated-from-task.patch index 54d64f5..55909f8 100644 --- a/SOURCES/0005-libgdm-Unref-the-manager-propagated-from-task.patch +++ b/SOURCES/0005-libgdm-Unref-the-manager-propagated-from-task.patch @@ -144,5 +144,5 @@ index f327344ec..fa4ba8426 100644 GAsyncReadyCallback callback, gpointer user_data) -- -2.26.2 +2.25.1 diff --git a/SOURCES/0006-libgdm-Don-t-double-ref-the-connection-got-from-task.patch b/SOURCES/0006-libgdm-Don-t-double-ref-the-connection-got-from-task.patch index 08dd061..7ac132d 100644 --- a/SOURCES/0006-libgdm-Don-t-double-ref-the-connection-got-from-task.patch +++ b/SOURCES/0006-libgdm-Don-t-double-ref-the-connection-got-from-task.patch @@ -96,5 +96,5 @@ index fa4ba8426..36292148c 100644 on_got_manager_for_opening_connection, task); -- -2.26.2 +2.25.1 diff --git a/SOURCES/0007-libgdm-Don-t-leak-connection-on-sync-re-authenticati.patch b/SOURCES/0007-libgdm-Don-t-leak-connection-on-sync-re-authenticati.patch index dc06760..ce68262 100644 --- a/SOURCES/0007-libgdm-Don-t-leak-connection-on-sync-re-authenticati.patch +++ b/SOURCES/0007-libgdm-Don-t-leak-connection-on-sync-re-authenticati.patch @@ -75,5 +75,5 @@ index 36292148c..335a040a2 100644 g_debug ("GdmClient: connecting to address: %s", client->priv->address); -- -2.26.2 +2.25.1 diff --git a/SOURCES/0008-libgdm-Use-auto-pointers-and-cleanup-code.patch b/SOURCES/0008-libgdm-Use-auto-pointers-and-cleanup-code.patch index d6f83a2..00d4b3d 100644 --- a/SOURCES/0008-libgdm-Use-auto-pointers-and-cleanup-code.patch +++ b/SOURCES/0008-libgdm-Use-auto-pointers-and-cleanup-code.patch @@ -127,5 +127,5 @@ index 335a040a2..7b42b6c99 100644 user_data); -- -2.26.2 +2.25.1 diff --git a/SOURCES/0009-libgdb-Try-to-reuse-connections-from-the-available-p.patch b/SOURCES/0009-libgdb-Try-to-reuse-connections-from-the-available-p.patch index 21a5822..89bc54b 100644 --- a/SOURCES/0009-libgdb-Try-to-reuse-connections-from-the-available-p.patch +++ b/SOURCES/0009-libgdb-Try-to-reuse-connections-from-the-available-p.patch @@ -471,5 +471,5 @@ index 7b42b6c99..acf016a48 100644 */ void -- -2.26.2 +2.25.1 diff --git a/SOURCES/0010-libgdm-Don-t-save-manager-address.patch b/SOURCES/0010-libgdm-Don-t-save-manager-address.patch index d095f09..841500c 100644 --- a/SOURCES/0010-libgdm-Don-t-save-manager-address.patch +++ b/SOURCES/0010-libgdm-Don-t-save-manager-address.patch @@ -303,5 +303,5 @@ index acf016a48..0e8bf4399 100644 gdm_client_set_enabled_extensions (GdmClient *client, const char * const *extensions) -- -2.26.2 +2.25.1 diff --git a/SOURCES/0011-libgdm-Return-NULL-on-invalid-client-instances.patch b/SOURCES/0011-libgdm-Return-NULL-on-invalid-client-instances.patch index d29b2bf..6d9e1a7 100644 --- a/SOURCES/0011-libgdm-Return-NULL-on-invalid-client-instances.patch +++ b/SOURCES/0011-libgdm-Return-NULL-on-invalid-client-instances.patch @@ -516,5 +516,5 @@ index 0e8bf4399..28cb72536 100644 */ GdmChooser * -- -2.26.2 +2.25.1 diff --git a/SOURCES/0012-libgdm-use-g_autoptr-to-manage-objects-lifecycle.patch b/SOURCES/0012-libgdm-use-g_autoptr-to-manage-objects-lifecycle.patch index 3380077..6bbae08 100644 --- a/SOURCES/0012-libgdm-use-g_autoptr-to-manage-objects-lifecycle.patch +++ b/SOURCES/0012-libgdm-use-g_autoptr-to-manage-objects-lifecycle.patch @@ -1271,5 +1271,5 @@ index 28cb72536..f9e3faee2 100644 client->priv->chooser = chooser; -- -2.26.2 +2.25.1 diff --git a/SOURCES/0013-libgdm-Fix-client-leaks-from-g_async_result_get_sour.patch b/SOURCES/0013-libgdm-Fix-client-leaks-from-g_async_result_get_sour.patch index 2e36a05..56b3fbe 100644 --- a/SOURCES/0013-libgdm-Fix-client-leaks-from-g_async_result_get_sour.patch +++ b/SOURCES/0013-libgdm-Fix-client-leaks-from-g_async_result_get_sour.patch @@ -168,5 +168,5 @@ index f9e3faee2..66f6102ec 100644 gdm_user_verifier_call_enable_extensions (user_verifier, (const char * const *) -- -2.26.2 +2.25.1 diff --git a/SOURCES/0014-libgdm-Fetch-connection-synchronously.patch b/SOURCES/0014-libgdm-Fetch-connection-synchronously.patch index acb2330..6a2cddc 100644 --- a/SOURCES/0014-libgdm-Fetch-connection-synchronously.patch +++ b/SOURCES/0014-libgdm-Fetch-connection-synchronously.patch @@ -210,5 +210,5 @@ index 66f6102ec..afe78087f 100644 g_return_val_if_fail (GDM_IS_CLIENT (client), NULL); -- -2.26.2 +2.25.1 diff --git a/SOURCES/0015-libgdm-Don-t-leak-user-verifier-extensions-on-unlock.patch b/SOURCES/0015-libgdm-Don-t-leak-user-verifier-extensions-on-unlock.patch index b9b4de9..56f9690 100644 --- a/SOURCES/0015-libgdm-Don-t-leak-user-verifier-extensions-on-unlock.patch +++ b/SOURCES/0015-libgdm-Don-t-leak-user-verifier-extensions-on-unlock.patch @@ -1,4 +1,4 @@ -From 760810cd751c8a511b4eb58c0159fef1163f7355 Mon Sep 17 00:00:00 2001 +From 1b212d79948db72a302234ba1d23d267375be47b Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Fri, 25 Sep 2020 15:27:47 -0400 Subject: [PATCH 15/15] libgdm: Don't leak user verifier extensions on unlock @@ -10,14 +10,76 @@ This commit ties the user verifier extensions to the user verifier instance associated with it, instead of storing the extensions directly in the client struct. --- - libgdm/gdm-client.c | 70 +++++++++++++++++++++++++++++++-------------- - 1 file changed, 48 insertions(+), 22 deletions(-) + libgdm/gdm-client.c | 165 +++++++++++++++++++++++++++++++++++--------- + 1 file changed, 131 insertions(+), 34 deletions(-) diff --git a/libgdm/gdm-client.c b/libgdm/gdm-client.c -index afe78087f..752961227 100644 +index afe78087f..7074cb14b 100644 --- a/libgdm/gdm-client.c +++ b/libgdm/gdm-client.c -@@ -147,193 +147,204 @@ user_verifier_data_new (GTask *task, GdmUserVerifier *user_verifier) +@@ -14,60 +14,61 @@ + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + + #include "config.h" + + #include + #include + #include + #include + + #include + #include + #include + + #include "gdm-client.h" + #include "gdm-client-glue.h" + #include "gdm-manager-glue.h" + + #define GDM_CLIENT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_CLIENT, GdmClientPrivate)) + + #define SESSION_DBUS_PATH "/org/gnome/DisplayManager/Session" + + struct GdmClientPrivate + { + GdmUserVerifier *user_verifier; ++ GdmUserVerifier *user_verifier_for_reauth; + GHashTable *user_verifier_extensions; + + GdmGreeter *greeter; + GdmRemoteGreeter *remote_greeter; + GdmChooser *chooser; + + char **enabled_extensions; + }; + + static void gdm_client_class_init (GdmClientClass *klass); + static void gdm_client_init (GdmClient *client); + static void gdm_client_finalize (GObject *object); + + G_DEFINE_TYPE (GdmClient, gdm_client, G_TYPE_OBJECT); + + static gpointer client_object = NULL; + + GQuark + gdm_client_error_quark (void) + { + static GQuark error_quark = 0; + + if (error_quark == 0) + error_quark = g_quark_from_static_string ("gdm-client"); + + return error_quark; + } + + static GDBusConnection * + gdm_client_get_open_connection (GdmClient *client) +@@ -147,193 +148,204 @@ user_verifier_data_new (GTask *task, GdmUserVerifier *user_verifier) data = g_slice_new (UserVerifierData); data->task = g_object_ref (task); @@ -54,7 +116,7 @@ index afe78087f..752961227 100644 - if (client->priv->user_verifier_extensions != NULL) { - g_hash_table_iter_init (&iter, client->priv->user_verifier_extensions); -+ user_verifier_extensions = g_object_get_data (G_OBJECT (client->priv->user_verifier), "gdm-client-user-verifier-extensions"); ++ user_verifier_extensions = g_object_get_data (G_OBJECT (data->user_verifier), "gdm-client-user-verifier-extensions"); + if (user_verifier_extensions != NULL) { + g_hash_table_iter_init (&iter, user_verifier_extensions); while (g_hash_table_iter_next (&iter, &key, &value)) { @@ -235,7 +297,144 @@ index afe78087f..752961227 100644 gdm_user_verifier_proxy_new (connection, G_DBUS_PROXY_FLAGS_NONE, NULL, -@@ -637,87 +648,93 @@ gdm_client_open_reauthentication_channel_finish (GdmClient *client, +@@ -533,191 +545,229 @@ gdm_client_open_reauthentication_channel_sync (GdmClient *client, + + ret = gdm_manager_call_open_reauthentication_channel_sync (manager, + username, + &address, + cancellable, + error); + + if (!ret) { + return NULL; + } + + g_debug ("GdmClient: connecting to address: %s", address); + + connection = g_dbus_connection_new_for_address_sync (address, + G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, + NULL, + cancellable, + error); + + if (connection == NULL) { + return NULL; + } + + user_verifier = gdm_user_verifier_proxy_new_sync (connection, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + SESSION_DBUS_PATH, + cancellable, + error); + ++ if (client->priv->user_verifier_for_reauth != NULL) { ++ g_object_remove_weak_pointer (G_OBJECT (client->priv->user_verifier_for_reauth), ++ (gpointer *) ++ &client->priv->user_verifier_for_reauth); ++ } ++ ++ client->priv->user_verifier_for_reauth = user_verifier; ++ ++ if (user_verifier != NULL) { ++ g_object_add_weak_pointer (G_OBJECT (client->priv->user_verifier_for_reauth), ++ (gpointer *) ++ &client->priv->user_verifier_for_reauth); ++ } ++ + return user_verifier; + } + + /** + * gdm_client_open_reauthentication_channel: + * @client: a #GdmClient + * @username: user to reauthenticate + * @callback: a #GAsyncReadyCallback to call when the request is satisfied + * @user_data: The data to pass to @callback + * @cancellable: a #GCancellable + * + * Gets a #GdmUserVerifier object that can be used to + * reauthenticate an already logged in user. + */ + void + gdm_client_open_reauthentication_channel (GdmClient *client, + const char *username, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) + { + GTask *task; + + g_return_if_fail (GDM_IS_CLIENT (client)); + + task = g_task_new (G_OBJECT (client), + cancellable, + callback, + user_data); + + g_object_set_data_full (G_OBJECT (task), + "username", + g_strdup (username), + (GDestroyNotify) + g_free); + + get_manager (client, + cancellable, + (GAsyncReadyCallback) + on_got_manager_for_reauthentication, + task); + } + + /** + * gdm_client_open_reauthentication_channel_finish: + * @client: a #GdmClient + * @result: The #GAsyncResult from the callback + * @error: a #GError + * + * Finishes an operation started with + * gdm_client_open_reauthentication_channel(). + * + * Returns: (transfer full): a #GdmUserVerifier + */ + GdmUserVerifier * + gdm_client_open_reauthentication_channel_finish (GdmClient *client, + GAsyncResult *result, + GError **error) + { ++ GdmUserVerifier *user_verifier; ++ + g_return_val_if_fail (GDM_IS_CLIENT (client), NULL); + +- return g_task_propagate_pointer (G_TASK (result), error); ++ user_verifier = g_task_propagate_pointer (G_TASK (result), error); ++ ++ if (client->priv->user_verifier_for_reauth != NULL) { ++ g_object_remove_weak_pointer (G_OBJECT (client->priv->user_verifier_for_reauth), ++ (gpointer *) ++ &client->priv->user_verifier_for_reauth); ++ } ++ ++ client->priv->user_verifier_for_reauth = user_verifier; ++ ++ if (user_verifier != NULL) { ++ g_object_add_weak_pointer (G_OBJECT (client->priv->user_verifier_for_reauth), ++ (gpointer *) ++ &client->priv->user_verifier_for_reauth); ++ } ++ ++ return user_verifier; + } + + /** + * gdm_client_get_user_verifier_sync: + * @client: a #GdmClient + * @cancellable: a #GCancellable + * @error: a #GError + * + * Gets a #GdmUserVerifier object that can be used to + * verify a user's local account. + * + * Returns: (transfer full): #GdmUserVerifier or %NULL if not connected */ GdmUserVerifier * gdm_client_get_user_verifier_sync (GdmClient *client, @@ -335,7 +534,7 @@ index afe78087f..752961227 100644 G_DBUS_PROXY_FLAGS_NONE, NULL, SESSION_DBUS_PATH, -@@ -765,86 +782,95 @@ gdm_client_get_user_verifier (GdmClient *client, +@@ -765,86 +815,102 @@ gdm_client_get_user_verifier (GdmClient *client, g_steal_pointer (&task)); } @@ -366,19 +565,23 @@ index afe78087f..752961227 100644 if (user_verifier == NULL) return NULL; -- client->priv->user_verifier = user_verifier; + if (client->priv->user_verifier != NULL) { + g_object_remove_weak_pointer (G_OBJECT (client->priv->user_verifier), + (gpointer *) + &client->priv->user_verifier); + } - - g_object_add_weak_pointer (G_OBJECT (client->priv->user_verifier), - (gpointer *) - &client->priv->user_verifier); - -+ client->priv->user_verifier = user_verifier; + + client->priv->user_verifier = user_verifier; + +- g_object_add_weak_pointer (G_OBJECT (client->priv->user_verifier), +- (gpointer *) +- &client->priv->user_verifier); ++ if (user_verifier != NULL) { ++ g_object_add_weak_pointer (G_OBJECT (client->priv->user_verifier), ++ (gpointer *) ++ &client->priv->user_verifier); ++ } + return user_verifier; } @@ -396,9 +599,14 @@ index afe78087f..752961227 100644 gdm_client_get_user_verifier_choice_list (GdmClient *client) { - if (client->priv->user_verifier_extensions == NULL) -+ GHashTable *user_verifier_extensions; ++ GHashTable *user_verifier_extensions = NULL; ++ ++ if (client->priv->user_verifier_for_reauth != NULL) ++ user_verifier_extensions = g_object_get_data (G_OBJECT (client->priv->user_verifier_for_reauth), "gdm-client-user-verifier-extensions"); ++ ++ if (user_verifier_extensions == NULL && client->priv->user_verifier != NULL) ++ user_verifier_extensions = g_object_get_data (G_OBJECT (client->priv->user_verifier), "gdm-client-user-verifier-extensions"); + -+ user_verifier_extensions = g_object_get_data (G_OBJECT (client->priv->user_verifier), "gdm-client-user-verifier-extensions"); + if (user_verifier_extensions == NULL) return NULL; @@ -434,6 +642,305 @@ index afe78087f..752961227 100644 { g_autoptr(GTask) task = user_data; g_autoptr(GError) error = NULL; +@@ -929,65 +995,73 @@ gdm_client_get_greeter (GdmClient *client, + g_steal_pointer (&task)); + } + + /** + * gdm_client_get_greeter_finish: + * @client: a #GdmClient + * @result: The #GAsyncResult from the callback + * @error: a #GError + * + * Finishes an operation started with + * gdm_client_get_greeter(). + * + * Returns: (transfer full): a #GdmGreeter + */ + GdmGreeter * + gdm_client_get_greeter_finish (GdmClient *client, + GAsyncResult *result, + GError **error) + { + GdmGreeter *greeter; + + g_return_val_if_fail (GDM_IS_CLIENT (client), NULL); + + if (client->priv->greeter != NULL) + return g_object_ref (client->priv->greeter); + + greeter = g_task_propagate_pointer (G_TASK (result), error); + if (greeter == NULL) + return NULL; + ++ if (client->priv->greeter != NULL) { ++ g_object_remove_weak_pointer (G_OBJECT (client->priv->greeter), ++ (gpointer *) ++ &client->priv->greeter); ++ } ++ + client->priv->greeter = greeter; + +- g_object_add_weak_pointer (G_OBJECT (client->priv->greeter), +- (gpointer *) +- &client->priv->greeter); ++ if (greeter != NULL) { ++ g_object_add_weak_pointer (G_OBJECT (client->priv->greeter), ++ (gpointer *) ++ &client->priv->greeter); ++ } + + return greeter; + } + + /** + * gdm_client_get_greeter_sync: + * @client: a #GdmClient + * @cancellable: a #GCancellable + * @error: a #GError + * + * Gets a #GdmGreeter object that can be used + * to do do various login screen related tasks, such + * as selecting a users session, and starting that + * session. + * + * Returns: (transfer full): #GdmGreeter or %NULL if caller is not a greeter + */ + GdmGreeter * + 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); + } + + connection = gdm_client_get_connection_sync (client, cancellable, error); + +@@ -1099,65 +1173,73 @@ gdm_client_get_remote_greeter (GdmClient *client, + g_steal_pointer (&task)); + } + + /** + * gdm_client_get_remote_greeter_finish: + * @client: a #GdmClient + * @result: The #GAsyncResult from the callback + * @error: a #GError + * + * Finishes an operation started with + * gdm_client_get_remote_greeter(). + * + * Returns: (transfer full): a #GdmRemoteGreeter + */ + GdmRemoteGreeter * + gdm_client_get_remote_greeter_finish (GdmClient *client, + GAsyncResult *result, + GError **error) + { + GdmRemoteGreeter *remote_greeter; + + g_return_val_if_fail (GDM_IS_CLIENT (client), NULL); + + if (client->priv->remote_greeter != NULL) + return g_object_ref (client->priv->remote_greeter); + + remote_greeter = g_task_propagate_pointer (G_TASK (result), error); + if (remote_greeter == NULL) + return NULL; + ++ if (client->priv->remote_greeter != NULL) { ++ g_object_remove_weak_pointer (G_OBJECT (client->priv->remote_greeter), ++ (gpointer *) ++ &client->priv->remote_greeter); ++ } ++ + client->priv->remote_greeter = remote_greeter; + +- g_object_add_weak_pointer (G_OBJECT (client->priv->remote_greeter), +- (gpointer *) +- &client->priv->remote_greeter); ++ if (remote_greeter != NULL) { ++ g_object_add_weak_pointer (G_OBJECT (client->priv->remote_greeter), ++ (gpointer *) ++ &client->priv->remote_greeter); ++ } + + return remote_greeter; + } + + /** + * gdm_client_get_remote_greeter_sync: + * @client: a #GdmClient + * @cancellable: a #GCancellable + * @error: a #GError + * + * Gets a #GdmRemoteGreeter object that can be used + * to do do various remote login screen related tasks, + * such as disconnecting. + * + * Returns: (transfer full): #GdmRemoteGreeter or %NULL if caller is not remote + */ + GdmRemoteGreeter * + 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); + } + + connection = gdm_client_get_connection_sync (client, cancellable, error); + + if (connection == NULL) { +@@ -1267,65 +1349,73 @@ gdm_client_get_chooser (GdmClient *client, + g_steal_pointer (&task)); + } + + /** + * gdm_client_get_chooser_finish: + * @client: a #GdmClient + * @result: The #GAsyncResult from the callback + * @error: a #GError + * + * Finishes an operation started with + * gdm_client_get_chooser(). + * + * Returns: (transfer full): a #GdmChooser + */ + GdmChooser * + gdm_client_get_chooser_finish (GdmClient *client, + GAsyncResult *result, + GError **error) + { + GdmChooser *chooser; + + g_return_val_if_fail (GDM_IS_CLIENT (client), NULL); + + if (client->priv->chooser != NULL) + return g_object_ref (client->priv->chooser); + + chooser = g_task_propagate_pointer (G_TASK (result), error); + if (chooser == NULL) + return NULL; + ++ if (client->priv->chooser != NULL) { ++ g_object_remove_weak_pointer (G_OBJECT (client->priv->chooser), ++ (gpointer *) ++ &client->priv->chooser); ++ } ++ + client->priv->chooser = chooser; + +- g_object_add_weak_pointer (G_OBJECT (client->priv->chooser), +- (gpointer *) +- &client->priv->chooser); ++ if (chooser != NULL) { ++ g_object_add_weak_pointer (G_OBJECT (client->priv->chooser), ++ (gpointer *) ++ &client->priv->chooser); ++ } + + return chooser; + } + + /** + * gdm_client_get_chooser_sync: + * @client: a #GdmClient + * @cancellable: a #GCancellable + * @error: a #GError + * + * Gets a #GdmChooser object that can be used + * to do do various XDMCP chooser related tasks, such + * as selecting a host or disconnecting. + * + * Returns: (transfer full): #GdmChooser or %NULL if caller is not a chooser + */ + GdmChooser * + 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); + } + + connection = gdm_client_get_connection_sync (client, cancellable, error); + + if (connection == NULL) { +@@ -1355,60 +1445,67 @@ gdm_client_class_init (GdmClientClass *klass) + + object_class->finalize = gdm_client_finalize; + + g_type_class_add_private (klass, sizeof (GdmClientPrivate)); + + } + + static void + gdm_client_init (GdmClient *client) + { + + client->priv = GDM_CLIENT_GET_PRIVATE (client); + } + + static void + gdm_client_finalize (GObject *object) + { + GdmClient *client; + + g_return_if_fail (object != NULL); + g_return_if_fail (GDM_IS_CLIENT (object)); + + client = GDM_CLIENT (object); + + g_return_if_fail (client->priv != NULL); + + if (client->priv->user_verifier != NULL) { + g_object_remove_weak_pointer (G_OBJECT (client->priv->user_verifier), + (gpointer *) + &client->priv->user_verifier); ++ ++ } ++ ++ if (client->priv->user_verifier_for_reauth != NULL) { ++ g_object_remove_weak_pointer (G_OBJECT (client->priv->user_verifier_for_reauth), ++ (gpointer *) ++ &client->priv->user_verifier_for_reauth); + } + + if (client->priv->greeter != NULL) { + g_object_remove_weak_pointer (G_OBJECT (client->priv->greeter), + (gpointer *) + &client->priv->greeter); + } + + if (client->priv->remote_greeter != NULL) { + g_object_remove_weak_pointer (G_OBJECT (client->priv->remote_greeter), + (gpointer *) + &client->priv->remote_greeter); + } + + if (client->priv->chooser != NULL) { + g_object_remove_weak_pointer (G_OBJECT (client->priv->chooser), + (gpointer *) + &client->priv->chooser); + } + + g_strfreev (client->priv->enabled_extensions); + + G_OBJECT_CLASS (gdm_client_parent_class)->finalize (object); + } + + GdmClient * + gdm_client_new (void) + { + if (client_object != NULL) { + g_object_ref (client_object); -- -2.26.2 +2.25.1 diff --git a/SPECS/gdm.spec b/SPECS/gdm.spec index 26a6a15..bc59e23 100644 --- a/SPECS/gdm.spec +++ b/SPECS/gdm.spec @@ -10,7 +10,7 @@ Name: gdm Epoch: 1 Version: 3.28.2 -Release: 25%{?dist} +Release: 26%{?dist} Summary: The GNOME Display Manager License: GPLv2+ @@ -404,6 +404,10 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor >&/dev/null || : %{_libdir}/pkgconfig/gdm-pam-extensions.pc %changelog +* Thu Nov 12 2020 Ray Strode - 3.28.2-26 +- Fix warning during unlock + Related: #1897063 + * Fri Sep 25 2020 Ray Strode - 3.28.2-25 - Backport some libgdm leak fixes from upstream Resolves: #1882821