diff options
author | Ray Strode <rstrode@redhat.com> | 2016-06-22 10:13:07 -0400 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2016-06-22 10:15:30 -0400 |
commit | e980b9101bfb1387df3cab4bf0c5ebdb4c6badbb (patch) | |
tree | 0d34589bfe09407b224dc96acf98efa9ec716109 | |
parent | e979ff9df4c9e2629c6098fafccc0eed716cde29 (diff) | |
download | gdm-e980b9101bfb1387df3cab4bf0c5ebdb4c6badbb.tar.gz |
local-display-factory: disconnect signal handlers when factory is disposed
There's the potential for a crash in the shutdown path after the
factory is disposed, since we fail to disconnect signal handlers to
the displays / display store at factory dispose time.
This commit changes the g_signal_connect to g_signal_connect_object, to
avoid any potential for crash.
(this is a fix noticed when reading through the source. It's tangentially
related to a discussion on irc for a different bug)
-rw-r--r-- | daemon/gdm-local-display-factory.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c index d06f3789..cf84439f 100644 --- a/daemon/gdm-local-display-factory.c +++ b/daemon/gdm-local-display-factory.c @@ -536,8 +536,10 @@ on_display_added (GdmDisplayStore *display_store, display = gdm_display_store_lookup (display_store, id); if (display != NULL) { - g_signal_connect (display, "notify::status", - G_CALLBACK (on_display_status_changed), factory); + g_signal_connect_object (display, "notify::status", + G_CALLBACK (on_display_status_changed), + factory, + 0); g_object_weak_ref (G_OBJECT (display), (GWeakNotify)on_display_disposed, factory); } @@ -569,15 +571,17 @@ gdm_local_display_factory_start (GdmDisplayFactory *base_factory) store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory)); - g_signal_connect (G_OBJECT (store), - "display-added", - G_CALLBACK (on_display_added), - factory); - - g_signal_connect (G_OBJECT (store), - "display-removed", - G_CALLBACK (on_display_removed), - factory); + g_signal_connect_object (G_OBJECT (store), + "display-added", + G_CALLBACK (on_display_added), + factory, + 0); + + g_signal_connect_object (G_OBJECT (store), + "display-removed", + G_CALLBACK (on_display_removed), + factory, + 0); gdm_local_display_factory_start_monitor (factory); return gdm_local_display_factory_sync_seats (factory); |