summaryrefslogtreecommitdiffstats
path: root/src/libserver
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2015-07-16 15:22:51 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2015-07-16 15:22:51 +0100
commit80bce97605e1b514acbb36f365dd40b7105007ed (patch)
treec9e4d791e968fc68adb10e4e0f731bb254d2807d /src/libserver
parent970fd7cc1c903cbb6124e3a6bff28ab0d94cece1 (diff)
downloadrspamd-80bce97605e1b514acbb36f365dd40b7105007ed.tar.gz
rspamd-80bce97605e1b514acbb36f365dd40b7105007ed.zip
Add logic to preserve newlines in HTML.
Diffstat (limited to 'src/libserver')
-rw-r--r--src/libserver/html.c29
1 files changed, 26 insertions, 3 deletions
diff --git a/src/libserver/html.c b/src/libserver/html.c
index 914d21feb..a6e136481 100644
--- a/src/libserver/html.c
+++ b/src/libserver/html.c
@@ -1031,7 +1031,7 @@ add_html_node (struct rspamd_task *task,
static gboolean
rspamd_html_process_tag (rspamd_mempool_t *pool, struct html_content *hc,
- struct html_tag *tag, GNode **cur_level)
+ struct html_tag *tag, GNode **cur_level, gboolean *balanced)
{
GNode *nnode;
@@ -1046,17 +1046,29 @@ rspamd_html_process_tag (rspamd_mempool_t *pool, struct html_content *hc,
nnode = g_node_new (tag);
+ if (tag->params) {
+ rspamd_mempool_add_destructor (pool,
+ (rspamd_mempool_destruct_t) g_list_free,
+ tag->params);
+ }
+
if (tag->flags & FL_CLOSING) {
if (!*cur_level) {
debug_task ("bad parent node");
+ g_node_destroy (nnode);
return FALSE;
}
+
g_node_append (*cur_level, nnode);
if (!rspamd_html_check_balance (nnode, cur_level)) {
debug_task (
"mark part as unbalanced as it has not pairable closing tags");
hc->flags |= RSPAMD_HTML_FLAG_UNBALANCED;
+ *balanced = FALSE;
+ }
+ else {
+ *balanced = TRUE;
}
}
else {
@@ -1386,7 +1398,7 @@ rspamd_html_process_part (rspamd_mempool_t *pool, struct html_content *hc,
{
const guchar *p, *c, *end, *tag_start = NULL, *savep = NULL;
guchar t;
- gboolean closing = FALSE, need_decode = FALSE, save_space = FALSE;
+ gboolean closing = FALSE, need_decode = FALSE, save_space = FALSE, balanced;
GByteArray *dest;
guint obrace = 0, ebrace = 0;
GNode *cur_level = NULL;
@@ -1678,18 +1690,29 @@ rspamd_html_process_part (rspamd_mempool_t *pool, struct html_content *hc,
savep = NULL;
if (cur_tag != NULL) {
- if (rspamd_html_process_tag (pool, hc, cur_tag, &cur_level)) {
+ balanced = TRUE;
+
+ if (rspamd_html_process_tag (pool, hc, cur_tag, &cur_level,
+ &balanced)) {
state = content_write;
need_decode = FALSE;
}
else {
state = content_ignore;
}
+
+ if ((cur_tag->id == Tag_P || cur_tag->id == Tag_BR ||
+ cur_tag->id == Tag_HR) && balanced) {
+ /* Insert newline */
+ g_byte_array_append (dest, "\r\n", 2);
+ save_space = FALSE;
+ }
}
else {
state = content_write;
}
+
p++;
c = p;
cur_tag = NULL;