diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2015-07-15 17:03:12 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2015-07-15 17:03:12 +0100 |
commit | f195719ee3385afa09c65b5b665bee70ef735b06 (patch) | |
tree | 00a882ebdb42b62cc3f3ae3de25c4d600c1e8b91 | |
parent | 4c65c411bd717f286195190ea754a50a697eb488 (diff) | |
download | rspamd-f195719ee3385afa09c65b5b665bee70ef735b06.tar.gz rspamd-f195719ee3385afa09c65b5b665bee70ef735b06.zip |
Use more fine-grained input to simplify tests.
-rw-r--r-- | src/libserver/html.c | 37 | ||||
-rw-r--r-- | src/libserver/html.h | 4 |
2 files changed, 22 insertions, 19 deletions
diff --git a/src/libserver/html.c b/src/libserver/html.c index d3eb8777e..ef72f1397 100644 --- a/src/libserver/html.c +++ b/src/libserver/html.c @@ -1155,7 +1155,7 @@ add_html_node (struct rspamd_task *task, } static void -rspamd_html_parse_tag_content (struct rspamd_task *task, +rspamd_html_parse_tag_content (rspamd_mempool_t *pool, struct html_content *hc, struct html_tag *tag, const guchar *in, gint *statep, guchar **savep) { @@ -1418,7 +1418,8 @@ rspamd_html_parse_tag_content (struct rspamd_task *task, } gboolean -rspamd_html_process_part (struct rspamd_task *task, struct mime_text_part *part) +rspamd_html_process_part (rspamd_mempool_t *pool, struct html_content *hc, + GByteArray *in) { const guchar *p, *c, *end, t, *tag_start = NULL; guchar *savep = NULL; @@ -1443,12 +1444,13 @@ rspamd_html_process_part (struct rspamd_task *task, struct mime_text_part *part) content_write, } state = parse_start; - g_assert (part != NULL); - g_assert (part->orig != NULL); + g_assert (in != NULL); + g_assert (hc != NULL); + g_assert (pool != NULL); if (!tags_sorted) { qsort (tag_defs, G_N_ELEMENTS ( - tag_defs), sizeof (struct html_tag), tag_cmp); + tag_defs), sizeof (struct html_tag_def), tag_cmp); tags_sorted = 1; } if (!entities_sorted) { @@ -1460,12 +1462,11 @@ rspamd_html_process_part (struct rspamd_task *task, struct mime_text_part *part) entities_sorted = 1; } - part->html = rspamd_mempool_alloc0 (task->task_pool, sizeof (*part->html)); - dest = g_byte_array_sized_new (part->orig->len / 3 * 2); + dest = g_byte_array_sized_new (in->len / 3 * 2); - p = part->orig->data; + p = in->data; c = p; - end = p + part->orig->len; + end = p + in->len; while (p < end) { t = *p; @@ -1477,7 +1478,7 @@ rspamd_html_process_part (struct rspamd_task *task, struct mime_text_part *part) } else { /* We have no starting tag, so assume that it's content */ - part->html->flags |= RSPAMD_HTML_FLAG_BAD_START; + hc->flags |= RSPAMD_HTML_FLAG_BAD_START; state = content_write; } @@ -1495,7 +1496,7 @@ rspamd_html_process_part (struct rspamd_task *task, struct mime_text_part *part) break; case '?': state = xml_tag; - part->html->flags |= RSPAMD_HTML_FLAG_XML; + hc->flags |= RSPAMD_HTML_FLAG_XML; p ++; break; case '/': @@ -1505,7 +1506,7 @@ rspamd_html_process_part (struct rspamd_task *task, struct mime_text_part *part) break; case '>': /* Empty tag */ - part->html->flags |= RSPAMD_HTML_FLAG_BAD_ELEMENTS; + hc->flags |= RSPAMD_HTML_FLAG_BAD_ELEMENTS; state = tag_end; p ++; tag_start = NULL; @@ -1514,7 +1515,7 @@ rspamd_html_process_part (struct rspamd_task *task, struct mime_text_part *part) state = tag_content; substate = 0; savep = NULL; - cur_tag = rspamd_mempool_alloc0 (sizeof (*cur_tag)); + cur_tag = rspamd_mempool_alloc0 (pool, sizeof (*cur_tag)); break; } @@ -1546,7 +1547,7 @@ rspamd_html_process_part (struct rspamd_task *task, struct mime_text_part *part) } else if (t == '>') { /* Misformed xml tag */ - part->html->flags |= RSPAMD_HTML_FLAG_BAD_ELEMENTS; + hc->flags |= RSPAMD_HTML_FLAG_BAD_ELEMENTS; state = tag_end; continue; } @@ -1559,7 +1560,7 @@ rspamd_html_process_part (struct rspamd_task *task, struct mime_text_part *part) state = tag_end; } else { - part->html->flags |= RSPAMD_HTML_FLAG_BAD_ELEMENTS; + hc->flags |= RSPAMD_HTML_FLAG_BAD_ELEMENTS; p ++; } break; @@ -1579,7 +1580,7 @@ rspamd_html_process_part (struct rspamd_task *task, struct mime_text_part *part) case comment_tag: if (t != '-') { - part->html->flags |= RSPAMD_HTML_FLAG_BAD_ELEMENTS; + hc->flags |= RSPAMD_HTML_FLAG_BAD_ELEMENTS; } p ++; ebrace = 0; @@ -1620,7 +1621,7 @@ rspamd_html_process_part (struct rspamd_task *task, struct mime_text_part *part) break; case tag_content: - rspamd_html_parse_tag_content (task, part->html, cur_tag, + rspamd_html_parse_tag_content (pool, hc, cur_tag, p, &substate, &savep); if (t == '>') { state = tag_end; @@ -1635,7 +1636,7 @@ rspamd_html_process_part (struct rspamd_task *task, struct mime_text_part *part) savep = NULL; if (cur_tag != NULL) { - if (rspamd_html_process_tag (task, part->html, cur_tag)) { + if (rspamd_html_process_tag (pool, hc, cur_tag)) { state = content_write; } else { diff --git a/src/libserver/html.h b/src/libserver/html.h index 25c6edeef..2635ca5e4 100644 --- a/src/libserver/html.h +++ b/src/libserver/html.h @@ -68,6 +68,8 @@ struct html_tag * get_tag_by_name (const gchar *name); */ void rspamd_html_decode_entitles_inplace (gchar *s, guint *len); -gboolean rspamd_html_process_part (struct mime_text_part *part); +gboolean rspamd_html_process_part (rspamd_mempool_t *pool, + struct html_content *hc, + GByteArray *in); #endif |