From 8ae4bf802aac4218ebfbe10cae09693ba64c05f3 Mon Sep 17 00:00:00 2001
From: David Woodhouse <David.Woodhouse@intel.com>
Date: Wed, 14 Jul 2010 11:54:01 +0100
Subject: Fix two memory leaks when replying

1: em_utils_reply_to_message() can be passed a newly-created message (from
a current selection. It needs to unref it. Which means that when we pass it
a message which *isn't* newly-created, we have to obtain a ref of our own.
It was that or add a boolean parameter to tell it whether to unref or not.

2: emf_finalize() wasn't unreferencing emf->message -- so when we clone
the EMFormat in em_utils_message_to_html() and immediately unreference the
clone, a refcount on the message got leaked. Fix emf_finalize() to unref
emf->message as presumably it should.
---
 mail/em-composer-utils.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

(limited to 'mail/em-composer-utils.c')

diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c
index e077e27e76..4884432492 100644
--- a/mail/em-composer-utils.c
+++ b/mail/em-composer-utils.c
@@ -2200,9 +2200,12 @@ reply_to_message(CamelFolder *folder, const gchar *uid, CamelMimeMessage *messag
 {
 	struct _reply_data *rd = user_data;
 
-	if (message != NULL)
+	if (message != NULL) {
+		/* get_message_free() will also unref the message, so we need
+		   an extra ref for em_utils_reply_to_message() to drop. */
+		g_object_ref(message);
 		em_utils_reply_to_message(folder, uid, message, rd->mode, rd->source);
-
+	}
 	if (rd->source)
 		g_object_unref(rd->source);
 	g_free(rd);
@@ -2223,7 +2226,7 @@ reply_to_message(CamelFolder *folder, const gchar *uid, CamelMimeMessage *messag
  *
  * If @message is non null, then it is used directly, @folder and @uid
  * may be supplied in order to update the message flags once it has
- * been replied to.
+ * been replied to. Note that @message will be unreferenced on completion.
  **/
 EMsgComposer *
 em_utils_reply_to_message(CamelFolder *folder, const gchar *uid, CamelMimeMessage *message, gint mode, EMFormat *source)
@@ -2286,6 +2289,7 @@ em_utils_reply_to_message(CamelFolder *folder, const gchar *uid, CamelMimeMessag
 
 	composer_set_body (composer, message, source);
 
+	g_object_unref(message);
 	emcs = g_object_get_data (G_OBJECT (composer), "emcs");
 	emcs_set_folder_info (emcs, folder, uid, flags, flags);
 
-- 
cgit