region: Cancel any async operations with callbacks on finalize

Otherwise we may end up using a finalized "object" in the callbacks.

https://bugzilla.gnome.org/show_bug.cgi?id=695534
This commit is contained in:
Rui Matos 2013-03-14 11:19:20 +01:00
parent e2163ea9ed
commit 3efb71bab7

View file

@ -83,6 +83,7 @@ struct _CcRegionPanelPrivate {
GPermission *permission; GPermission *permission;
SystemOp op; SystemOp op;
GDBusProxy *localed; GDBusProxy *localed;
GCancellable *cancellable;
GtkWidget *overlay; GtkWidget *overlay;
GtkWidget *notification; GtkWidget *notification;
@ -127,6 +128,9 @@ cc_region_panel_finalize (GObject *object)
CcRegionPanel *self = CC_REGION_PANEL (object); CcRegionPanel *self = CC_REGION_PANEL (object);
CcRegionPanelPrivate *priv = self->priv; CcRegionPanelPrivate *priv = self->priv;
g_cancellable_cancel (priv->cancellable);
g_clear_object (&priv->cancellable);
if (priv->user_manager) { if (priv->user_manager) {
g_signal_handlers_disconnect_by_data (priv->user_manager, self); g_signal_handlers_disconnect_by_data (priv->user_manager, self);
priv->user_manager = NULL; priv->user_manager = NULL;
@ -1510,17 +1514,22 @@ localed_proxy_ready (GObject *source,
gpointer data) gpointer data)
{ {
CcRegionPanel *self = data; CcRegionPanel *self = data;
CcRegionPanelPrivate *priv = self->priv; CcRegionPanelPrivate *priv;
GDBusProxy *proxy;
GError *error = NULL; GError *error = NULL;
priv->localed = g_dbus_proxy_new_finish (res, &error); proxy = g_dbus_proxy_new_finish (res, &error);
if (!priv->localed) { if (!proxy) {
g_warning ("Failed to contact localed: %s\n", error->message); if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
g_warning ("Failed to contact localed: %s\n", error->message);
g_error_free (error); g_error_free (error);
return; return;
} }
priv = self->priv;
priv->localed = proxy;
gtk_widget_set_sensitive (priv->login_button, TRUE); gtk_widget_set_sensitive (priv->login_button, TRUE);
g_signal_connect (priv->localed, "g-properties-changed", g_signal_connect (priv->localed, "g-properties-changed",
@ -1569,7 +1578,7 @@ setup_login_button (CcRegionPanel *self)
"org.freedesktop.locale1", "org.freedesktop.locale1",
"/org/freedesktop/locale1", "/org/freedesktop/locale1",
"org.freedesktop.locale1", "org.freedesktop.locale1",
NULL, priv->cancellable,
(GAsyncReadyCallback) localed_proxy_ready, (GAsyncReadyCallback) localed_proxy_ready,
self); self);
g_object_unref (bus); g_object_unref (bus);
@ -1609,6 +1618,8 @@ cc_region_panel_init (CcRegionPanel *self)
priv->user_manager = act_user_manager_get_default (); priv->user_manager = act_user_manager_get_default ();
priv->cancellable = g_cancellable_new ();
setup_login_button (self); setup_login_button (self);
setup_language_section (self); setup_language_section (self);
setup_input_section (self); setup_input_section (self);