talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit 373d079b4f9ac62ae1f9eaca202f29f9d4ed6b4a
parent 296282805f6b8485f80f5b9f7e696b1da2049dd2
Author: Colin Leroy <colin@colino.net>
Date:   Sun, 18 May 2014 20:40:04 +0200

Fix bug 3039, very long parsing time in HTML email. Avoid strcasestr
on very long buffers.

Diffstat:
Msrc/html.c | 20++++++++++++++++++--
1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/src/html.c b/src/html.c @@ -745,6 +745,22 @@ static void sc_html_parse_special(SC_HTMLParser *parser) sc_html_append_str(parser, symbol_name, -1); } +static gchar *sc_html_find_tag(SC_HTMLParser *parser, const gchar *tag) +{ + gchar *cur = parser->bufp; + gint len = strlen(tag); + + if (cur == NULL) + return NULL; + + while ((cur = strstr(cur, "<")) != NULL) { + if (!g_ascii_strncasecmp(cur, tag, len)) + return cur; + cur += 2; + } + return NULL; +} + static void sc_html_get_parenthesis(SC_HTMLParser *parser, gchar *buf, gint len) { gchar *p; @@ -762,14 +778,14 @@ static void sc_html_get_parenthesis(SC_HTMLParser *parser, gchar *buf, gint len) } if (!g_ascii_strncasecmp(parser->bufp, "<style", 6)) { parser->bufp += 6; - while ((p = strcasestr(parser->bufp, "</style>")) == NULL) + while ((p = sc_html_find_tag(parser, "</style>")) == NULL) if (sc_html_read_line(parser) == SC_HTML_EOF) return; parser->bufp = p + 8; return; } if (!g_ascii_strncasecmp(parser->bufp, "<script", 7)) { parser->bufp += 7; - while ((p = strcasestr(parser->bufp, "</script>")) == NULL) + while ((p = sc_html_find_tag(parser, "</script>")) == NULL) if (sc_html_read_line(parser) == SC_HTML_EOF) return; parser->bufp = p + 9; return;