summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2016-07-07 15:04:12 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2016-07-07 15:04:12 +0100
commit0055b96fac6afd77cf5a50eba59bd1d48dd1b9b8 (patch)
tree4fa579ddae4e03616d12bf36f3d78f4d903ee77f
parent56c8b4e5d0c90349e36f49504feb531f6fda3ca7 (diff)
downloadrspamd-0055b96fac6afd77cf5a50eba59bd1d48dd1b9b8.tar.gz
rspamd-0055b96fac6afd77cf5a50eba59bd1d48dd1b9b8.zip
[Fix] Properly detect end of headers position
-rw-r--r--src/libmime/message.c44
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,