[gnome-control-center] power: Fix crash when panel is closed quickly



commit d2f11556396df1254ccc27e46aa06eb1165c0a60
Author: Bastien Nocera <hadess hadess net>
Date:   Tue Feb 20 10:55:25 2018 +0100

    power: Fix crash when panel is closed quickly
    
    Another use-after-free on cancellation crash.
    
     #0  g_type_check_instance_cast (type_instance=type_instance@entry=0x1eac3c0, iface_type=32150864) at 
/glib/gobject/gtype.c:4057
     #1  0x0000000000494077 in got_screen_proxy_cb (source_object=<optimized out>, res=0x1eceab0, 
user_data=user_data@entry=0x1eac3c0)
         at panels/power/cc-power-panel.c:1083
    
    https://bugzilla.gnome.org/show_bug.cgi?id=789464

 panels/power/cc-power-panel.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)
---
diff --git a/panels/power/cc-power-panel.c b/panels/power/cc-power-panel.c
index d02077de7..aff0ae8e6 100644
--- a/panels/power/cc-power-panel.c
+++ b/panels/power/cc-power-panel.c
@@ -1080,11 +1080,11 @@ static void
 got_screen_proxy_cb (GObject *source_object, GAsyncResult *res, gpointer user_data)
 {
   GError *error = NULL;
-  CcPowerPanel *self = CC_POWER_PANEL (user_data);
-  CcPowerPanelPrivate *priv = self->priv;
+  CcPowerPanel *self;
+  GDBusProxy *screen_proxy;
 
-  priv->screen_proxy = g_dbus_proxy_new_for_bus_finish (res, &error);
-  if (priv->screen_proxy == NULL)
+  screen_proxy = g_dbus_proxy_new_for_bus_finish (res, &error);
+  if (screen_proxy == NULL)
     {
       if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
         g_printerr ("Error creating screen proxy: %s\n", error->message);
@@ -1092,8 +1092,11 @@ got_screen_proxy_cb (GObject *source_object, GAsyncResult *res, gpointer user_da
       return;
     }
 
+  self = CC_POWER_PANEL (user_data);
+  self->priv->screen_proxy = screen_proxy;
+
   /* we want to change the bar if the user presses brightness buttons */
-  g_signal_connect (priv->screen_proxy, "g-properties-changed",
+  g_signal_connect (screen_proxy, "g-properties-changed",
                     G_CALLBACK (on_screen_property_change), self);
 
   sync_screen_brightness (self);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]