[gdm] local-display-factory: disconnect signal handlers when factory is disposed
- From: Ray Strode <halfline src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gdm] local-display-factory: disconnect signal handlers when factory is disposed
- Date: Wed, 22 Jun 2016 14:16:54 +0000 (UTC)
commit e980b9101bfb1387df3cab4bf0c5ebdb4c6badbb
Author: Ray Strode <rstrode redhat com>
Date: Wed Jun 22 10:13:07 2016 -0400
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)
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 d06f378..cf84439 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);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]