components/gnome/gdm/patches/0001-fix-shutdown-crash.patch
changeset 7201 bcc18175756d
equal deleted inserted replaced
7200:bc003d56ef5a 7201:bcc18175756d
       
     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