diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2016-07-07 15:04:12 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2016-07-07 15:04:12 +0100 |
commit | 0055b96fac6afd77cf5a50eba59bd1d48dd1b9b8 (patch) | |
tree | 4fa579ddae4e03616d12bf36f3d78f4d903ee77f | |
parent | 56c8b4e5d0c90349e36f49504feb531f6fda3ca7 (diff) | |
download | rspamd-0055b96fac6afd77cf5a50eba59bd1d48dd1b9b8.tar.gz rspamd-0055b96fac6afd77cf5a50eba59bd1d48dd1b9b8.zip |
[Fix] Properly detect end of headers position
-rw-r--r-- | src/libmime/message.c | 44 |
1 files changed, 43 insertions, 1 deletions
diff --git a/src/libmime/message.c b/src/libmime/message.c index b7579ba25..de70d76bc 100644 --- a/src/libmime/message.c +++ b/src/libmime/message.c @@ -1300,6 +1300,44 @@ rspamd_message_from_data (struct rspamd_task *task, GByteArray *data, } } +static inline const gchar * +rspamd_message_find_body_start (const gchar *headers_end, const gchar *body_end) +{ + const gchar *p = headers_end; + enum { + st_start = 0, + st_cr, + st_lf, + } state = st_start; + + if (headers_end + 1 >= body_end) { + return headers_end; + } + + switch (state) { + case st_start: + if (*p == '\r') { + p ++; + state = st_cr; + } + else if (*p == '\n') { + p ++; + state = st_lf; + } + break; + case st_cr: + if (*p == '\n' && p < body_end) { + /* CRLF */ + p ++; + } + break; + case st_lf: + break; + } + + return p; +} + gboolean rspamd_message_parse (struct rspamd_task *task) { @@ -1415,8 +1453,12 @@ rspamd_message_parse (struct rspamd_task *task) hdr_pos = rspamd_string_find_eoh (&str); if (hdr_pos > 0 && hdr_pos < tmp->len) { + static const gchar *body_start; + + body_start = rspamd_message_find_body_start (p + hdr_pos, + p + len); task->raw_headers_content.begin = (gchar *) (p); - task->raw_headers_content.len = (guint64) (hdr_pos); + task->raw_headers_content.len = body_start - p; if (task->raw_headers_content.len > 0) { process_raw_headers (task, task->raw_headers, |