From: Colin Leroy Date: Sun, 18 May 2014 18:40:04 +0000 (+0200) Subject: Fix bug 3039, very long parsing time in HTML email. Avoid strcasestr X-Git-Tag: 3.10.0~38 X-Git-Url: http://git.claws-mail.org/?p=claws.git;a=commitdiff_plain;h=373d079b4f9ac62ae1f9eaca202f29f9d4ed6b4a;ds=sidebyside Fix bug 3039, very long parsing time in HTML email. Avoid strcasestr on very long buffers. --- diff --git a/src/html.c b/src/html.c index 010cf1203..874b59554 100644 --- 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, "bufp += 6; - while ((p = strcasestr(parser->bufp, "")) == NULL) + while ((p = sc_html_find_tag(parser, "")) == NULL) if (sc_html_read_line(parser) == SC_HTML_EOF) return; parser->bufp = p + 8; return; } if (!g_ascii_strncasecmp(parser->bufp, "bufp += 7; - while ((p = strcasestr(parser->bufp, "")) == NULL) + while ((p = sc_html_find_tag(parser, "")) == NULL) if (sc_html_read_line(parser) == SC_HTML_EOF) return; parser->bufp = p + 9; return;