[evolution] Fix two memory leaks when replying



commit 8ae4bf802aac4218ebfbe10cae09693ba64c05f3
Author: David Woodhouse <David Woodhouse intel com>
Date:   Wed Jul 14 11:54:01 2010 +0100

    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.

 em-format/em-format.c      |    3 +++
 mail/e-mail-reader-utils.c |    6 +++++-
 mail/e-mail-reader.c       |    3 +++
 mail/em-composer-utils.c   |   10 +++++++---
 4 files changed, 18 insertions(+), 4 deletions(-)
---
diff --git a/em-format/em-format.c b/em-format/em-format.c
index af49e10..c318655 100644
--- a/em-format/em-format.c
+++ b/em-format/em-format.c
@@ -100,6 +100,9 @@ emf_finalize (GObject *object)
 	if (emf->session)
 		g_object_unref (emf->session);
 
+	if (emf->message)
+		g_object_unref (emf->message);
+
 	g_hash_table_destroy (emf->inline_table);
 
 	em_format_clear_headers(emf);
diff --git a/mail/e-mail-reader-utils.c b/mail/e-mail-reader-utils.c
index 24655e7..8827375 100644
--- a/mail/e-mail-reader-utils.c
+++ b/mail/e-mail-reader-utils.c
@@ -384,8 +384,11 @@ e_mail_reader_reply_to_message (EMailReader *reader, CamelMimeMessage *src_messa
 	if (!gtk_widget_get_mapped (GTK_WIDGET(web_view)))
 		goto whole_message;
 
-	if (!src_message)
+	if (!src_message) {
 		src_message = CAMEL_MIME_MESSAGE (EM_FORMAT (formatter)->message);
+		if (src_message)
+			g_object_ref(src_message);
+	}
 
 	if (!e_mail_reader_get_quote_from_selection (reader))
 		goto whole_message;
@@ -421,6 +424,7 @@ e_mail_reader_reply_to_message (EMailReader *reader, CamelMimeMessage *src_messa
 		CAMEL_MIME_PART (new_message),
 		selection, length, "text/html");
 
+	g_object_unref(src_message);
 	em_utils_reply_to_message (
 		folder, uid, new_message, reply_mode, NULL);
 
diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c
index d9f49bf..74f0e7c 100644
--- a/mail/e-mail-reader.c
+++ b/mail/e-mail-reader.c
@@ -832,6 +832,9 @@ action_mail_reply_all_check(CamelFolder *folder, const gchar *uid, CamelMimeMess
 	if (!message)
 		return;
 
+	/* get_message_free() will unref the message, so we need to take an
+	   extra ref for e_mail_reader_reply_to_message() to own. */
+	g_object_ref(message);
 	to = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_TO);
 	cc = camel_mime_message_get_recipients (message, CAMEL_RECIPIENT_TYPE_CC);
 
diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c
index e077e27..4884432 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);
 



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