diff options
-rw-r--r-- | include/parser.h | 3 | ||||
-rw-r--r-- | src/scanner.l | 11 |
2 files changed, 14 insertions, 0 deletions
diff --git a/include/parser.h b/include/parser.h index d8d2eb11..2fb037cb 100644 --- a/include/parser.h +++ b/include/parser.h @@ -26,6 +26,7 @@ struct parser_state { unsigned int flex_state_pop; unsigned int startcond_type; struct list_head *cmds; + unsigned int *startcond_active; }; enum startcond_type { @@ -81,6 +82,8 @@ enum startcond_type { PARSER_SC_STMT_REJECT, PARSER_SC_STMT_SYNPROXY, PARSER_SC_STMT_TPROXY, + + __SC_MAX }; struct mnl_socket; diff --git a/src/scanner.l b/src/scanner.l index 7eb74020..5741261a 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -1144,6 +1144,8 @@ void *scanner_init(struct parser_state *state) yylex_init_extra(state, &scanner); yyset_out(NULL, scanner); + state->startcond_active = xzalloc_array(__SC_MAX, + sizeof(*state->startcond_active)); return scanner; } @@ -1173,6 +1175,8 @@ void scanner_destroy(struct nft_ctx *nft) struct parser_state *state = yyget_extra(nft->scanner); input_descriptor_list_destroy(state); + xfree(state->startcond_active); + yylex_destroy(nft->scanner); } @@ -1181,6 +1185,7 @@ static void scanner_push_start_cond(void *scanner, enum startcond_type type) struct parser_state *state = yyget_extra(scanner); state->startcond_type = type; + state->startcond_active[type]++; yy_push_state((int)type, scanner); } @@ -1189,6 +1194,8 @@ void scanner_pop_start_cond(void *scanner, enum startcond_type t) { struct parser_state *state = yyget_extra(scanner); + state->startcond_active[t]--; + if (state->startcond_type != t) { state->flex_state_pop++; return; /* Can't pop just yet! */ @@ -1198,6 +1205,10 @@ void scanner_pop_start_cond(void *scanner, enum startcond_type t) state->flex_state_pop--; state->startcond_type = yy_top_state(scanner); yy_pop_state(scanner); + + t = state->startcond_type; + if (state->startcond_active[t]) + return; } state->startcond_type = yy_top_state(scanner); |