Browse Source

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

tags/3.1
Vsevolod Stakhov 2 years ago
parent
commit
a26db85d6a
1 changed files with 20 additions and 9 deletions
  1. 20
    9
      src/libserver/html/html.cxx

+ 20
- 9
src/libserver/html/html.cxx View File

@@ -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…
Cancel
Save