From: Vsevolod Stakhov Date: Mon, 26 Dec 2016 15:47:14 +0000 (+0000) Subject: [Fix] Disable zero-copy mode for text parts to avoid crashes X-Git-Tag: 1.5.0~475 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=0d4c60d3ca58175284d9236851c66f840cdac705;p=rspamd.git [Fix] Disable zero-copy mode for text parts to avoid crashes --- diff --git a/src/libmime/mime_parser.c b/src/libmime/mime_parser.c index 3965b9bd5..777ef074c 100644 --- a/src/libmime/mime_parser.c +++ b/src/libmime/mime_parser.c @@ -311,8 +311,20 @@ rspamd_mime_parse_normal_part (struct rspamd_task *task, case RSPAMD_CTE_7BIT: case RSPAMD_CTE_8BIT: case RSPAMD_CTE_UNKNOWN: - part->parsed_data.begin = part->raw_data.begin; - part->parsed_data.len = part->raw_data.len; + if (IS_CT_TEXT (part->ct)) { + /* Need to copy text as we have couple of in-place change functions */ + parsed = rspamd_fstring_sized_new (part->raw_data.len); + parsed->len = part->raw_data.len; + memcpy (parsed->str, part->raw_data.begin, parsed->len); + part->parsed_data.begin = parsed->str; + part->parsed_data.len = parsed->len; + rspamd_mempool_add_destructor (task->task_pool, + (rspamd_mempool_destruct_t)rspamd_fstring_free, parsed); + } + else { + part->parsed_data.begin = part->raw_data.begin; + part->parsed_data.len = part->raw_data.len; + } break; case RSPAMD_CTE_QP: parsed = rspamd_fstring_sized_new (part->raw_data.len);