瀏覽代碼

[Minor] Add a special state to tags content parsing to avoid illegal lookahead

tags/3.1
Vsevolod Stakhov 2 年之前
父節點
當前提交
a26db85d6a
共有 1 個檔案被更改,包括 20 行新增9 行删除
  1. 20
    9
      src/libserver/html/html.cxx

+ 20
- 9
src/libserver/html/html.cxx 查看文件

@@ -249,6 +249,7 @@ html_parse_tag_content(rspamd_mempool_t *pool,
spaces_after_param,
ignore_bad_tag,
tag_end,
slash_after_value,
} state;

state = static_cast<enum tag_parser_state>(parser_env.cur_state);
@@ -384,8 +385,7 @@ html_parse_tag_content(rspamd_mempool_t *pool,
else if (*in == '/') {
store_component_name();
store_component_value();
tag->flags |= FL_CLOSED;
state = spaces_before_eq;
state = slash_after_value;
}
else if (*in == '>') {
store_component_name();
@@ -512,8 +512,8 @@ html_parse_tag_content(rspamd_mempool_t *pool,
break;

case parse_value:
if (*in == '/' && *(in + 1) == '>') {
tag->flags |= FL_CLOSED;
if (*in == '/') {
state = slash_after_value;
store_component_value();
}
else if (g_ascii_isspace (*in) || *in == '>' || *in == '"') {
@@ -530,8 +530,10 @@ html_parse_tag_content(rspamd_mempool_t *pool,
if (g_ascii_isspace (*in)) {
state = spaces_after_param;
}
else if (*in == '/' && *(in + 1) == '>') {
tag->flags |= FL_CLOSED;
else if (*in == '/') {
store_component_value();
store_value_character(true);
state = slash_after_value;
}
else {
/* No space, proceed immediately to the attribute name */
@@ -543,8 +545,8 @@ html_parse_tag_content(rspamd_mempool_t *pool,

case spaces_after_param:
if (!g_ascii_isspace (*in)) {
if (*in == '/' && *(in + 1) == '>') {
tag->flags |= FL_CLOSED;
if (*in == '/') {
state = slash_after_value;
}
else if (*in == '=') {
/* Attributes cannot start with '=' */
@@ -558,7 +560,16 @@ html_parse_tag_content(rspamd_mempool_t *pool,
}
}
break;

case slash_after_value:
if (*in == '>') {
tag->flags |= FL_CLOSED;
state = tag_end;
}
else if (!g_ascii_isspace(*in)) {
tag->flags |= FL_BROKEN;
state = parse_attr_name;
}
break;
case ignore_bad_tag:
case tag_end:
break;

Loading…
取消
儲存