diff -cr evolution-3.2.3_orig/mail/e-mail-folder-utils.c evolution-3.2.3/mail/e-mail-folder-utils.c *** evolution-3.2.3_orig/mail/e-mail-folder-utils.c 2012-10-10 10:01:23.065208531 +0200 --- evolution-3.2.3/mail/e-mail-folder-utils.c 2012-10-10 10:09:06.095504573 +0200 *************** *** 1178,1185 **** GError **error) { GFileOutputStream *file_output_stream; GByteArray *byte_array; - CamelStream *base_stream; gboolean success = TRUE; guint ii; --- 1178,1185 ---- GError **error) { GFileOutputStream *file_output_stream; + CamelStream *base_stream = NULL; GByteArray *byte_array; gboolean success = TRUE; guint ii; *************** *** 1208,1216 **** return FALSE; } - /* CamelStreamMem takes ownership of the GByteArray. */ byte_array = g_byte_array_new (); - base_stream = camel_stream_mem_new_with_byte_array (byte_array); for (ii = 0; ii < message_uids->len; ii++) { CamelMimeMessage *message; --- 1208,1214 ---- *************** *** 1221,1226 **** --- 1219,1235 ---- gint percent; gint retval; + if (base_stream != NULL) + g_object_unref (base_stream); + + /* CamelStreamMem does NOT take ownership of the byte + * array when set with camel_stream_mem_set_byte_array(). + * This allows us to reuse the same memory slab for each + * message, which is slightly more efficient. */ + base_stream = camel_stream_mem_new (); + camel_stream_mem_set_byte_array ( + CAMEL_STREAM_MEM (base_stream), byte_array); + uid = g_ptr_array_index (message_uids, ii); message = camel_folder_get_message_sync ( *************** *** 1278,1295 **** percent = ((ii + 1) * 100) / message_uids->len; camel_operation_progress (cancellable, percent); ! /* Flush the buffer for the next message. ! * For memory streams this never fails. */ ! g_seekable_seek ( ! G_SEEKABLE (base_stream), ! 0, G_SEEK_SET, NULL, NULL); g_object_unref (message); } exit: g_object_unref (file_output_stream); - g_object_unref (base_stream); camel_operation_pop_message (cancellable); --- 1287,1305 ---- percent = ((ii + 1) * 100) / message_uids->len; camel_operation_progress (cancellable, percent); ! /* Reset the byte array for the next message. */ ! g_byte_array_set_size (byte_array, 0); g_object_unref (message); } exit: + if (base_stream != NULL) + g_object_unref (base_stream); + + g_byte_array_free (byte_array, TRUE); + g_object_unref (file_output_stream); camel_operation_pop_message (cancellable);