[evolution] Bug #641154 - Crash in emae_check_authtype_done



commit a822d5da967c9d98d50cad83b9e36b1404195a19
Author: Milan Crha <mcrha redhat com>
Date:   Mon Jan 2 14:32:29 2012 +0100

    Bug #641154 - Crash in emae_check_authtype_done

 mail/em-account-editor.c |   40 ++++++++++++++++++++++++++++++++++------
 1 files changed, 34 insertions(+), 6 deletions(-)
---
diff --git a/mail/em-account-editor.c b/mail/em-account-editor.c
index 7164dbe..674c846 100644
--- a/mail/em-account-editor.c
+++ b/mail/em-account-editor.c
@@ -267,6 +267,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)
 {
 	e_config_target_changed (
@@ -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++)



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