[evolution/gnome-2-28] Bug #601787 - Double free in destroy_oof_data



commit 933a36c6176dd77c72983243796e459fea0ecc30
Author: Milan Crha <mcrha redhat com>
Date:   Mon Feb 22 20:48:12 2010 +0100

    Bug #601787 - Double free in destroy_oof_data

 .../exchange-operations/exchange-account-setup.c   |   24 ++++++++++---------
 .../exchange-folder-permission.c                   |    3 ++
 plugins/exchange-operations/exchange-folder.c      |   10 ++++++-
 3 files changed, 24 insertions(+), 13 deletions(-)
---
diff --git a/plugins/exchange-operations/exchange-account-setup.c b/plugins/exchange-operations/exchange-account-setup.c
index 296e442..3bf31df 100644
--- a/plugins/exchange-operations/exchange-account-setup.c
+++ b/plugins/exchange-operations/exchange-account-setup.c
@@ -55,7 +55,7 @@ GtkWidget* org_gnome_exchange_settings(EPlugin *epl, EConfigHookItemFactoryData
 GtkWidget *org_gnome_exchange_owa_url(EPlugin *epl, EConfigHookItemFactoryData *data);
 gboolean org_gnome_exchange_check_options(EPlugin *epl, EConfigHookPageCheckData *data);
 GtkWidget *org_gnome_exchange_auth_section (EPlugin *epl, EConfigHookItemFactoryData *data);
-void org_gnome_exchange_commit (EPlugin *epl, EConfigHookItemFactoryData *data);
+void org_gnome_exchange_commit (EPlugin *epl, EMConfigTargetAccount *target_account);
 GtkWidget* org_gnome_exchange_show_folder_size_factory (EPlugin *epl, EConfigHookItemFactoryData *data);
 
 CamelServiceAuthType camel_exchange_ntlm_authtype = {
@@ -86,7 +86,7 @@ typedef struct {
 	GtkWidget *text_view;
 }OOFData;
 
-static OOFData *oof_data;
+static OOFData *oof_data = NULL;
 
 static void
 update_state (GtkTextBuffer *buffer, gpointer data)
@@ -309,6 +309,7 @@ org_gnome_exchange_settings(EPlugin *epl, EConfigHookItemFactoryData *data)
 	gtk_text_buffer_get_bounds (buffer, &start, &end);
 	oof_message = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
 	if (oof_message && *oof_message) {
+		g_free (oof_data->message);
 		/* Will this ever happen? */
 		oof_data->message = oof_message;
 	}
@@ -850,6 +851,8 @@ set_oof_info (void)
 {
 	ExchangeAccount *account;
 
+	g_return_if_fail (oof_data != NULL);
+
 	account = exchange_operations_get_exchange_account ();
 
 	if (account && !exchange_oof_set (account, oof_data->state, oof_data->message)) {
@@ -861,21 +864,24 @@ set_oof_info (void)
 static void
 destroy_oof_data (void)
 {
-	if (oof_data->message)
+	if (oof_data && oof_data->message) {
 		g_free (oof_data->message);
-	if (oof_data)
+		oof_data->message = NULL;
+	}
+
+	if (oof_data) {
 		g_free (oof_data);
+		oof_data = NULL;
+	}
 }
 
 void
-org_gnome_exchange_commit (EPlugin *epl, EConfigHookItemFactoryData *data)
+org_gnome_exchange_commit (EPlugin *epl, EMConfigTargetAccount *target_account)
 {
-	EMConfigTargetAccount *target_account;
 	const gchar *source_url;
 	CamelURL *url;
 	gint offline_status;
 
-	target_account = (EMConfigTargetAccount *)data->config->target;
 	source_url = e_account_get_string (target_account->account,  E_ACCOUNT_SOURCE_URL);
 	if (source_url && source_url[0] != '\0')
 		url = camel_url_new (source_url, NULL);
@@ -888,10 +894,6 @@ org_gnome_exchange_commit (EPlugin *epl, EConfigHookItemFactoryData *data)
 
 		return;
 	}
-	if (data->old) {
-		camel_url_free(url);
-		return;
-	}
 
 	camel_url_free (url);
 
diff --git a/plugins/exchange-operations/exchange-folder-permission.c b/plugins/exchange-operations/exchange-folder-permission.c
index 7113ef8..5b7752f 100644
--- a/plugins/exchange-operations/exchange-folder-permission.c
+++ b/plugins/exchange-operations/exchange-folder-permission.c
@@ -170,6 +170,9 @@ org_gnome_exchange_folder_permissions (EPlugin *ep, EMPopupTargetFolder *target)
 	if (mode == OFFLINE_MODE)
 		return;
 
+	if (strlen (target->uri) <= strlen ("exchange://") + strlen (account->account_filename))
+		return;
+
 	path = target->uri + strlen ("exchange://") + strlen (account->account_filename);
 
 	if (!path || !*path)
diff --git a/plugins/exchange-operations/exchange-folder.c b/plugins/exchange-operations/exchange-folder.c
index 7c9f1bf..05d47c9 100644
--- a/plugins/exchange-operations/exchange-folder.c
+++ b/plugins/exchange-operations/exchange-folder.c
@@ -215,13 +215,19 @@ org_gnome_exchange_check_inbox_subscribed (EPlugin *ep, EMPopupTargetFolder *tar
 	if (!account)
 		return;
 
+	if (strlen (target->uri) <= strlen ("exchange://") + strlen (account->account_filename))
+		return;
+
 	path = g_strdup (target->uri + strlen ("exchange://") + strlen (account->account_filename));
 	sub_folder = strchr (path, '@');
 
+	if (!sub_folder || !g_strrstr(sub_folder, "/")) {
+		g_free (path);
+		return;
+	}
+
 	g_free (path);
 
-	if (!sub_folder || !g_strrstr(sub_folder, "/"))
-		return;
 
         for (i = 0; i < sizeof (popup_inbox_items) / sizeof (popup_inbox_items[0]); i++)
                 menus = g_slist_prepend (menus, &popup_inbox_items[i]);



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