I have attached a new patch that incoporates all upstream mods and which
I've tested thoroughly.  I no longer experience leaks in the exchange
connector.  In my opinion, this one is good to release.

Ben

diff -urN evolution-data-server-1.4.2.1.orig/servers/exchange/lib/e2k-freebusy.c evolution-data-server-1.4.2.1/servers/exchange/lib/e2k-freebusy.c
--- evolution-data-server-1.4.2.1.orig/servers/exchange/lib/e2k-freebusy.c	2005-09-02 11:37:45.000000000 -0300
+++ evolution-data-server-1.4.2.1/servers/exchange/lib/e2k-freebusy.c	2006-02-01 07:15:24.000000000 -0400
@@ -189,6 +189,8 @@
 	if (!E2K_HTTP_STATUS_IS_SUCCESSFUL (status) || nresults == 0) {
 		/* FIXME: create it */
 		g_free (uri);
+		if (nresults)
+			e2k_results_free (results, nresults);
 		return NULL;
 	}
 
diff -urN evolution-data-server-1.4.2.1.orig/servers/exchange/storage/e-folder-exchange.c evolution-data-server-1.4.2.1/servers/exchange/storage/e-folder-exchange.c
--- evolution-data-server-1.4.2.1.orig/servers/exchange/storage/e-folder-exchange.c	2005-11-28 23:03:48.000000000 -0400
+++ evolution-data-server-1.4.2.1/servers/exchange/storage/e-folder-exchange.c	2006-02-01 07:24:25.000000000 -0400
@@ -478,14 +478,15 @@
 	physical_uri = e_folder_get_physical_uri (folder);
 	internal_uri = e_folder_exchange_get_internal_uri (folder);
 	permanent_uri = e_folder_exchange_get_permanent_uri (folder);
+	
+	g_return_val_if_fail (name && type && physical_uri && internal_uri,
+			      FALSE);
+
 	if ((fsize = e_folder_exchange_get_folder_size (folder)) >= 0)
 		folder_size = g_strdup_printf ("%llu", fsize);
 	else
 		return FALSE;
 
-	g_return_val_if_fail (name && type && physical_uri && internal_uri,
-			      FALSE);
-
 	doc = xmlNewDoc ("1.0");
 	root = xmlNewDocNode (doc, NULL, "connector-folder", NULL);
 	xmlNewProp (root, "version", "1");
@@ -502,6 +503,9 @@
 
 	status = xmlSaveFile (filename, doc);
 	xmlFreeDoc (doc);
+
+	g_free (folder_size);
+
 	if (status < 0)
 		unlink (filename);
 
diff -urN evolution-data-server-1.4.2.1.orig/servers/exchange/storage/exchange-account.c evolution-data-server-1.4.2.1/servers/exchange/storage/exchange-account.c
--- evolution-data-server-1.4.2.1.orig/servers/exchange/storage/exchange-account.c	2005-11-28 23:03:48.000000000 -0400
+++ evolution-data-server-1.4.2.1/servers/exchange/storage/exchange-account.c	2006-02-01 07:00:15.000000000 -0400
@@ -1616,6 +1616,8 @@
 		account->priv->connecting = FALSE;
 		*info_result = EXCHANGE_ACCOUNT_UNKNOWN_ERROR;
 		g_mutex_unlock (account->priv->connect_lock);
+		if (nresults)
+			e2k_results_free (results, nresults);
 		return NULL; /* FIXME: what error has happened? */
 	}
 
@@ -1633,6 +1635,7 @@
 		timezone = e2k_properties_get_prop (results[0].props, E2K_PR_EXCHANGE_TIMEZONE);
 		if (timezone)
 			account->default_timezone = g_strdup (timezone);
+		e2k_results_free (results, nresults);
 	}
 
 	if (!setup_account_hierarchies (account)) {
@@ -1789,8 +1792,11 @@
 				       &results, &nresults);
 	g_free (foreign_uri);
 
-	if (!E2K_HTTP_STATUS_IS_SUCCESSFUL (status) || nresults == 0)
+	if (!E2K_HTTP_STATUS_IS_SUCCESSFUL (status) || nresults == 0) {
+		if (nresults)
+			e2k_results_free (results, nresults);
 		return NULL;
+	}
 
 	prop = e2k_properties_get_prop (results[0].props, std_uri_prop);
 	if (prop)
diff -urN evolution-data-server-1.4.2.1.orig/servers/exchange/storage/exchange-esource.c evolution-data-server-1.4.2.1/servers/exchange/storage/exchange-esource.c
--- evolution-data-server-1.4.2.1.orig/servers/exchange/storage/exchange-esource.c	2005-09-02 11:37:45.000000000 -0300
+++ evolution-data-server-1.4.2.1/servers/exchange/storage/exchange-esource.c	2006-02-01 07:13:10.000000000 -0400
@@ -102,8 +102,10 @@
 		}
 		e_source_set_property (source, "username", username);
 		e_source_set_property (source, "auth-domain", "Exchange");
-		if (authtype)
+		if (authtype) {
 			e_source_set_property (source, "auth-type", authtype);
+			g_free (authtype);
+		}
 		if (is_contacts_folder)
 			e_source_set_property (source, "auth", "plain/password");
 		else
@@ -128,8 +130,10 @@
 
 			e_source_set_property (source, "username", username);
 			e_source_set_property (source, "auth-domain", "Exchange");
-			if (authtype)
+			if (authtype) {
 				e_source_set_property (source, "auth-type", authtype);
+				g_free (authtype);
+			}
 			if (is_contacts_folder)
 				e_source_set_property (source, "auth", "plain/password");
 			else
diff -urN evolution-data-server-1.4.2.1.orig/servers/exchange/storage/exchange-hierarchy-favorites.c evolution-data-server-1.4.2.1/servers/exchange/storage/exchange-hierarchy-favorites.c
--- evolution-data-server-1.4.2.1.orig/servers/exchange/storage/exchange-hierarchy-favorites.c	2005-09-02 11:37:45.000000000 -0300
+++ evolution-data-server-1.4.2.1/servers/exchange/storage/exchange-hierarchy-favorites.c	2006-02-01 07:03:35.000000000 -0400
@@ -155,6 +155,9 @@
 					     g_strdup (shortcut_uri));
 			e2k_results_free (results, nresults);
 		}
+		else if (nresults) {
+			e2k_results_free (results, nresults);
+		}
 
 		g_free (perm_url);
 	}
diff -urN evolution-data-server-1.4.2.1.orig/servers/exchange/storage/exchange-hierarchy-foreign.c evolution-data-server-1.4.2.1/servers/exchange/storage/exchange-hierarchy-foreign.c
--- evolution-data-server-1.4.2.1.orig/servers/exchange/storage/exchange-hierarchy-foreign.c	2005-09-02 11:37:45.000000000 -0300
+++ evolution-data-server-1.4.2.1/servers/exchange/storage/exchange-hierarchy-foreign.c	2006-02-01 07:08:01.000000000 -0400
@@ -146,6 +146,8 @@
 	hfor->priv->checked_hide_private = TRUE;
 
 	if (!E2K_HTTP_STATUS_IS_SUCCESSFUL (status) || nresults == 0) {
+		if (nresults)
+			e2k_results_free (results, nresults);
 		g_mutex_unlock (hfor->priv->hide_private_lock);
 		return;
 	}
@@ -223,14 +225,19 @@
 	status = e2k_context_propfind (ctx, NULL, uri,
 				       folder_props, n_folder_props,
 				       &results, &nresults);
-	if (!E2K_HTTP_STATUS_IS_SUCCESSFUL (status)) 
+	if (!E2K_HTTP_STATUS_IS_SUCCESSFUL (status)) {
+		if (nresults)
+			e2k_results_free (results, nresults);
 		return exchange_hierarchy_webdav_status_to_folder_result (status);
+	}
 	if (nresults == 0)
 		return EXCHANGE_ACCOUNT_FOLDER_DOES_NOT_EXIST;
 
 	access = e2k_properties_get_prop (results[0].props, PR_ACCESS);
-	if (!access || !atoi (access))
+	if (!access || !atoi (access)) {
+		e2k_results_free (results, nresults);
 		return EXCHANGE_ACCOUNT_FOLDER_PERMISSION_DENIED;
+	}
 
 	folder = exchange_hierarchy_webdav_parse_folder (hwd, hier->toplevel,
 							 &results[0]);
diff -urN evolution-data-server-1.4.2.1.orig/servers/exchange/storage/exchange-hierarchy-somedav.c evolution-data-server-1.4.2.1/servers/exchange/storage/exchange-hierarchy-somedav.c
--- evolution-data-server-1.4.2.1.orig/servers/exchange/storage/exchange-hierarchy-somedav.c	2005-09-02 11:37:45.000000000 -0300
+++ evolution-data-server-1.4.2.1/servers/exchange/storage/exchange-hierarchy-somedav.c	2006-02-01 07:10:00.000000000 -0400
@@ -238,13 +238,18 @@
 	status = e2k_context_propfind (ctx, NULL, uri,
 				       folder_props, n_folder_props,
 				       &results, &nresults);
-	if (!E2K_HTTP_STATUS_IS_SUCCESSFUL (status)) 
+	if (!E2K_HTTP_STATUS_IS_SUCCESSFUL (status)) {
+		if (nresults)
+			e2k_results_free (results, nresults);
 		return exchange_hierarchy_webdav_status_to_folder_result (status);
+	}
 	if (nresults == 0)
 		return EXCHANGE_ACCOUNT_FOLDER_DOES_NOT_EXIST;
 
-	if (folder_is_unreadable (results[0].props))
+	if (folder_is_unreadable (results[0].props)) {
+		e2k_results_free (results, nresults);
 		return EXCHANGE_ACCOUNT_FOLDER_PERMISSION_DENIED;
+	}
 
 	folder = exchange_hierarchy_webdav_parse_folder (hwd, hier->toplevel,
 							 &results[0]);
diff -urN evolution-data-server-1.4.2.1.orig/servers/exchange/storage/exchange-hierarchy-webdav.c evolution-data-server-1.4.2.1/servers/exchange/storage/exchange-hierarchy-webdav.c
--- evolution-data-server-1.4.2.1.orig/servers/exchange/storage/exchange-hierarchy-webdav.c	2005-09-02 11:37:45.000000000 -0300
+++ evolution-data-server-1.4.2.1/servers/exchange/storage/exchange-hierarchy-webdav.c	2006-02-01 06:54:43.000000000 -0400
@@ -726,6 +726,7 @@
 			subtrees = g_slist_prepend (subtrees, folder);
 		}
 		exchange_hierarchy_new_folder (hier, folder);
+		g_object_unref (folder);
 
 		/* Check the folder size here */
 		name = e2k_properties_get_prop (result->props,
diff -urN evolution-data-server-1.4.2.1.orig/servers/exchange/storage/exchange-oof.c evolution-data-server-1.4.2.1/servers/exchange/storage/exchange-oof.c
--- evolution-data-server-1.4.2.1.orig/servers/exchange/storage/exchange-oof.c	2005-09-02 11:37:45.000000000 -0300
+++ evolution-data-server-1.4.2.1/servers/exchange/storage/exchange-oof.c	2006-02-01 07:14:16.000000000 -0400
@@ -91,8 +91,11 @@
 		status = e2k_context_propfind (ctx, NULL, url, &prop, 1,
 					       &results, &nresults);
 		g_free (url);
-		if (!E2K_HTTP_STATUS_IS_SUCCESSFUL (status) || nresults == 0)
+		if (!E2K_HTTP_STATUS_IS_SUCCESSFUL (status) || nresults == 0) {
+			if (nresults)
+				e2k_results_free (results, nresults);
 			return FALSE;
+		}
 
 		prop = e2k_properties_get_prop (results[0].props, E2K_PR_EXCHANGE_OOF_STATE);
 		*oof = prop && atoi (prop);

Reply via email to