aboutsummaryrefslogtreecommitdiffstats
path: root/mail/em-format.c
diff options
context:
space:
mode:
authorSrinivasa Ragavan <sragavan@novell.com>2006-11-27 02:30:29 +0800
committerSrinivasa Ragavan <sragavan@src.gnome.org>2006-11-27 02:30:29 +0800
commit0a7017c1a673ec61479db348d7ff7452b19f664e (patch)
treec5f84ec17098333fb9498ae98a70b3832c2a5f1e /mail/em-format.c
parentd8b4b86497a9b95433b2fe967d3bec62cd6bc69c (diff)
downloadgsoc2013-evolution-0a7017c1a673ec61479db348d7ff7452b19f664e.tar.gz
gsoc2013-evolution-0a7017c1a673ec61479db348d7ff7452b19f664e.tar.zst
gsoc2013-evolution-0a7017c1a673ec61479db348d7ff7452b19f664e.zip
Fix for bug #337439 DoS attach with large emails
2006-11-26 Srinivasa Ragavan <sragavan@novell.com> * Fix for bug #337439 DoS attach with large emails svn path=/trunk/; revision=33024
Diffstat (limited to 'mail/em-format.c')
-rw-r--r--mail/em-format.c32
1 files changed, 24 insertions, 8 deletions
diff --git a/mail/em-format.c b/mail/em-format.c
index b89d1e0423..e1f1893a0a 100644
--- a/mail/em-format.c
+++ b/mail/em-format.c
@@ -47,6 +47,7 @@
#include <camel/camel-string-utils.h>
#include <camel/camel-stream-filter.h>
#include <camel/camel-stream-null.h>
+#include <camel/camel-stream-mem.h>
#include <camel/camel-mime-filter-charset.h>
#include <camel/camel-mime-filter-windows.h>
#include <camel/camel-mime-filter-pgp.h>
@@ -80,7 +81,6 @@ static const EMFormatHandler *emf_find_handler(EMFormat *emf, const char *mime_t
static void emf_format_clone(EMFormat *emf, CamelFolder *folder, const char *uid, CamelMimeMessage *msg, EMFormat *emfsource);
static void emf_format_secure(EMFormat *emf, CamelStream *stream, CamelMimePart *part, CamelCipherValidity *valid);
static gboolean emf_busy(EMFormat *emf);
-
enum {
EMF_COMPLETE,
EMF_LAST_SIGNAL,
@@ -117,8 +117,10 @@ static void
emf_init(GObject *o)
{
EMFormat *emf = (EMFormat *)o;
-
+ char * asize;
+
emf->inline_table = g_hash_table_new(g_str_hash, g_str_equal);
+ emf->composer = FALSE;
e_dlist_init(&emf->header_list);
em_format_default_headers(emf);
emf->part_id = g_string_new("");
@@ -469,6 +471,7 @@ em_format_find_visible_puri(EMFormat *emf, const char *uri)
* Return value:
**/
EMFormatPURI *
+
em_format_find_puri(EMFormat *emf, const char *uri)
{
return g_hash_table_lookup(emf->pending_uri_table, uri);
@@ -1016,7 +1019,7 @@ em_format_format_content(EMFormat *emf, CamelStream *stream, CamelMimePart *part
CamelDataWrapper *dw = camel_medium_get_content_object((CamelMedium *)part);
if (camel_content_type_is (dw->mime_type, "text", "*"))
- em_format_format_text(emf, stream, dw);
+ em_format_format_text(emf, stream, part);
else
camel_data_wrapper_decode_to_stream(dw, stream);
}
@@ -1036,6 +1039,9 @@ em_format_format_text(EMFormat *emf, CamelStream *stream, CamelDataWrapper *dw)
CamelMimeFilterCharset *filter;
const char *charset = NULL;
CamelMimeFilterWindows *windows = NULL;
+ CamelStream *mem_stream = NULL;
+ size_t size;
+ size_t max;
if (emf->charset) {
charset = emf->charset;
@@ -1064,17 +1070,27 @@ em_format_format_text(EMFormat *emf, CamelStream *stream, CamelDataWrapper *dw)
} else if (charset == NULL) {
charset = emf->default_charset;
}
-
- filter_stream = camel_stream_filter_new_with_stream(stream);
+
+ mem_stream = (CamelStreamMem *)camel_stream_mem_new ();
+ filter_stream = camel_stream_filter_new_with_stream(mem_stream);
if ((filter = camel_mime_filter_charset_new_convert(charset, "UTF-8"))) {
camel_stream_filter_add(filter_stream, (CamelMimeFilter *) filter);
camel_object_unref(filter);
}
-
- camel_data_wrapper_decode_to_stream(dw, (CamelStream *)filter_stream);
+
+ max = mail_config_get_message_limit();
+ size = camel_data_wrapper_decode_to_stream(emf->mode == EM_FORMAT_SOURCE ? (CamelDataWrapper *)dw: camel_medium_get_content_object((CamelMedium *)dw), (CamelStream *)filter_stream);
camel_stream_flush((CamelStream *)filter_stream);
camel_object_unref(filter_stream);
+ camel_stream_reset (mem_stream);
+
+ if (max == -1 || size < (max * 1024) || emf->composer) {
+ camel_stream_write_to_stream(mem_stream, (CamelStream *)stream);
+ camel_stream_flush((CamelStream *)stream);
+ } else {
+ ((EMFormatClass *)G_OBJECT_GET_CLASS(emf))->format_optional(emf, stream, (CamelMimePart *)dw, mem_stream);
+ }
if (windows)
camel_object_unref(windows);
@@ -1495,7 +1511,7 @@ emf_message_rfc822(EMFormat *emf, CamelStream *stream, CamelMimePart *part, cons
static void
emf_message_deliverystatus(EMFormat *emf, CamelStream *stream, CamelMimePart *part, const EMFormatHandler *info)
{
- em_format_format_text(emf, stream, camel_medium_get_content_object((CamelMedium *)part));
+ em_format_format_text(emf, stream, part);
}
static void