|
1 From ad177152bc5e75dcf4b04d60931a3723f3fba4df Mon Sep 17 00:00:00 2001 |
|
2 From: Ray Strode <[email protected]> |
|
3 Date: Wed, 22 Jun 2016 10:13:07 -0400 |
|
4 Subject: [PATCH 01/19] fix shutdown crash |
|
5 |
|
6 Backport of upstream fix from |
|
7 https://git.gnome.org/browse/gdm/commit/?id=e980b9101bfb1387df3cab4bf0c5ebdb4c6badbb |
|
8 |
|
9 local-display-factory: disconnect signal handlers when factory is disposed |
|
10 |
|
11 There's the potential for a crash in the shutdown path after the |
|
12 factory is disposed, since we fail to disconnect signal handlers to |
|
13 the displays / display store at factory dispose time. |
|
14 |
|
15 This commit changes the g_signal_connect to g_signal_connect_object, to |
|
16 avoid any potential for crash. |
|
17 |
|
18 (this is a fix noticed when reading through the source. It's tangentially |
|
19 related to a discussion on irc for a different bug) |
|
20 --- |
|
21 daemon/gdm-local-display-factory.c | 26 +++++++++++++++----------- |
|
22 1 file changed, 15 insertions(+), 11 deletions(-) |
|
23 |
|
24 diff --git a/daemon/gdm-local-display-factory.c b/daemon/gdm-local-display-factory.c |
|
25 index c794313..de6ecdd 100644 |
|
26 --- a/daemon/gdm-local-display-factory.c |
|
27 +++ b/daemon/gdm-local-display-factory.c |
|
28 @@ -549,8 +549,10 @@ on_display_added (GdmDisplayStore *display_store, |
|
29 display = gdm_display_store_lookup (display_store, id); |
|
30 |
|
31 if (display != NULL) { |
|
32 - g_signal_connect (display, "notify::status", |
|
33 - G_CALLBACK (on_display_status_changed), factory); |
|
34 + g_signal_connect_object (display, "notify::status", |
|
35 + G_CALLBACK (on_display_status_changed), |
|
36 + factory, |
|
37 + 0); |
|
38 |
|
39 g_object_weak_ref (G_OBJECT (display), (GWeakNotify)on_display_disposed, factory); |
|
40 } |
|
41 @@ -582,15 +584,17 @@ gdm_local_display_factory_start (GdmDisplayFactory *base_factory) |
|
42 |
|
43 store = gdm_display_factory_get_display_store (GDM_DISPLAY_FACTORY (factory)); |
|
44 |
|
45 - g_signal_connect (G_OBJECT (store), |
|
46 - "display-added", |
|
47 - G_CALLBACK (on_display_added), |
|
48 - factory); |
|
49 - |
|
50 - g_signal_connect (G_OBJECT (store), |
|
51 - "display-removed", |
|
52 - G_CALLBACK (on_display_removed), |
|
53 - factory); |
|
54 + g_signal_connect_object (G_OBJECT (store), |
|
55 + "display-added", |
|
56 + G_CALLBACK (on_display_added), |
|
57 + factory, |
|
58 + 0); |
|
59 + |
|
60 + g_signal_connect_object (G_OBJECT (store), |
|
61 + "display-removed", |
|
62 + G_CALLBACK (on_display_removed), |
|
63 + factory, |
|
64 + 0); |
|
65 |
|
66 gdm_local_display_factory_start_monitor (factory); |
|
67 return gdm_local_display_factory_sync_seats (factory); |
|
68 -- |
|
69 2.7.4 |
|
70 |