summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2016-06-22 10:13:07 -0400
committerRay Strode <rstrode@redhat.com>2016-06-22 10:15:30 -0400
commite980b9101bfb1387df3cab4bf0c5ebdb4c6badbb (patch)
tree0d34589bfe09407b224dc96acf98efa9ec716109
parente979ff9df4c9e2629c6098fafccc0eed716cde29 (diff)
downloadgdm-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.c26
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);