From a822d5da967c9d98d50cad83b9e36b1404195a19 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Mon, 2 Jan 2012 14:32:29 +0100 Subject: Bug #641154 - Crash in emae_check_authtype_done --- mail/em-account-editor.c | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c index 7164dbe53f..674c846973 100644 --- a/mail/em-account-editor.c +++ b/mail/em-account-editor.c @@ -266,6 +266,22 @@ static void emae_account_folder_changed (EMFolderSelectionButton *folder, EMAcco G_DEFINE_TYPE (EMAccountEditor, em_account_editor, G_TYPE_OBJECT) +static void +emae_config_gone_cb (gpointer pemae, GObject *pconfig) +{ + EMAccountEditor *emae = pemae; + struct _EMConfig *config = (struct _EMConfig *) pconfig; + + if (!emae) + return; + + if (emae->config == config) + emae->config = NULL; + + if (emae->priv && emae->priv->config == config) + emae->priv->config = NULL; +} + static void emae_config_target_changed_cb (EMAccountEditor *emae) { @@ -875,6 +891,9 @@ emae_finalize (GObject *object) EMAccountEditor *emae = EM_ACCOUNT_EDITOR (object); EMAccountEditorPrivate *priv = emae->priv; + if (priv->config) + g_object_weak_unref ((GObject *) priv->config, emae_config_gone_cb, emae); + if (priv->sig_added_id) { ESignatureList *signatures; @@ -2472,7 +2491,9 @@ emae_check_authtype_done (CamelService *camel_service, available_authtypes = camel_service_query_auth_types_finish ( camel_service, result, &error); - editor = E_CONFIG (service->emae->config)->window; + editor = NULL; + if (service->emae && service->emae->config && E_IS_CONFIG (service->emae->config)) + editor = E_CONFIG (service->emae->config)->window; if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { g_warn_if_fail (available_authtypes == NULL); @@ -2480,10 +2501,11 @@ emae_check_authtype_done (CamelService *camel_service, } else if (error != NULL) { g_warn_if_fail (available_authtypes == NULL); - e_alert_run_dialog_for_args ( - GTK_WINDOW (service->check_dialog), - "mail:checking-service-error", - error->message, NULL); + if (service->check_dialog) + e_alert_run_dialog_for_args ( + GTK_WINDOW (service->check_dialog), + "mail:checking-service-error", + error->message, NULL); g_error_free (error); } else { @@ -2493,7 +2515,10 @@ emae_check_authtype_done (CamelService *camel_service, g_list_free (available_authtypes); } - gtk_widget_destroy (service->check_dialog); + if (service->check_dialog) { + g_object_weak_unref (G_OBJECT (service->check_dialog), (GWeakNotify) g_nullify_pointer, &service->check_dialog); + gtk_widget_destroy (service->check_dialog); + } service->check_dialog = NULL; if (editor != NULL) @@ -2570,6 +2595,7 @@ emae_check_authtype (GtkWidget *w, service->check_dialog = e_alert_dialog_new_for_args ( parent, "mail:checking-service", NULL); + g_object_weak_ref (G_OBJECT (service->check_dialog), (GWeakNotify) g_nullify_pointer, &service->check_dialog); g_object_ref (service->emae); @@ -5273,6 +5299,8 @@ em_account_editor_construct (EMAccountEditor *emae, ec, "commit", G_CALLBACK (emae_commit), emae); + g_object_weak_ref (G_OBJECT (ec), emae_config_gone_cb, emae); + emae->config = priv->config = ec; l = NULL; for (i = 0; items[i].path; i++) -- cgit v1.2.3