summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2014-02-04 08:09:27 +0000
committerPatrick McHardy <kaber@trash.net>2014-02-04 08:12:01 +0000
commitf164cb18c0a94701a641bce4f141d51990b8eef1 (patch)
tree4f43c9da59ba2ec4e0bff7a07ba98f1d68e550eb
parente9194645cc1b7a07a1e90a394b025d9859f97064 (diff)
parser: close scope when encountering an error in a table or chain block
Close the scopes when destroying a table_block/chain_block. Also add assertions to open_scope()/close_scope() to catch memory corruption early. Signed-off-by: Patrick McHardy <kaber@trash.net>
-rw-r--r--src/parser.y6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/parser.y b/src/parser.y
index 24f022a5..fa33b570 100644
--- a/src/parser.y
+++ b/src/parser.y
@@ -52,12 +52,14 @@ static struct scope *current_scope(const struct parser_state *state)
static void open_scope(struct parser_state *state, struct scope *scope)
{
+ assert(state->scope < array_size(state->scopes) - 1);
scope_init(scope, current_scope(state));
state->scopes[++state->scope] = scope;
}
static void close_scope(struct parser_state *state)
{
+ assert(state->scope > 0);
state->scope--;
}
@@ -367,9 +369,9 @@ static void location_update(struct location *loc, struct location *rhs, int n)
%type <val> handle_spec family_spec position_spec
%type <table> table_block_alloc table_block
-%destructor { table_free($$); } table_block_alloc
+%destructor { close_scope(state); table_free($$); } table_block_alloc
%type <chain> chain_block_alloc chain_block
-%destructor { chain_free($$); } chain_block_alloc
+%destructor { close_scope(state); chain_free($$); } chain_block_alloc
%type <rule> rule
%destructor { rule_free($$); } rule