diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libnftables.c | 30 | ||||
-rw-r--r-- | src/parser_bison.y | 27 |
2 files changed, 27 insertions, 30 deletions
diff --git a/src/libnftables.c b/src/libnftables.c index d8de89ca..8720fe2b 100644 --- a/src/libnftables.c +++ b/src/libnftables.c @@ -348,7 +348,6 @@ static const struct input_descriptor indesc_cmdline = { static int nft_parse_bison_buffer(struct nft_ctx *nft, const char *buf, struct list_head *msgs, struct list_head *cmds) { - struct cmd *cmd; int ret; parser_init(nft, nft->state, msgs, cmds); @@ -359,16 +358,12 @@ static int nft_parse_bison_buffer(struct nft_ctx *nft, const char *buf, if (ret != 0 || nft->state->nerrs > 0) return -1; - list_for_each_entry(cmd, cmds, list) - nft_cmd_expand(cmd); - return 0; } static int nft_parse_bison_filename(struct nft_ctx *nft, const char *filename, struct list_head *msgs, struct list_head *cmds) { - struct cmd *cmd; int ret; parser_init(nft, nft->state, msgs, cmds); @@ -380,6 +375,23 @@ static int nft_parse_bison_filename(struct nft_ctx *nft, const char *filename, if (ret != 0 || nft->state->nerrs > 0) return -1; + return 0; +} + +static int nft_evaluate(struct nft_ctx *nft, struct list_head *msgs, + struct list_head *cmds) +{ + struct cmd *cmd; + + list_for_each_entry(cmd, cmds, list) { + struct eval_ctx ectx = { + .nft = nft, + .msgs = msgs, + }; + if (cmd_evaluate(&ectx, cmd) < 0) + return -1; + } + list_for_each_entry(cmd, cmds, list) nft_cmd_expand(cmd); @@ -404,6 +416,10 @@ int nft_run_cmd_from_buffer(struct nft_ctx *nft, const char *buf) if (rc) goto err; + rc = nft_evaluate(nft, &msgs, &cmds); + if (rc < 0) + goto err; + if (nft_netlink(nft, &cmds, &msgs, nft->nf_sock) != 0) rc = -1; err: @@ -448,6 +464,10 @@ int nft_run_cmd_from_filename(struct nft_ctx *nft, const char *filename) if (rc) goto err; + rc = nft_evaluate(nft, &msgs, &cmds); + if (rc < 0) + goto err; + if (nft_netlink(nft, &cmds, &msgs, nft->nf_sock) != 0) rc = -1; err: diff --git a/src/parser_bison.y b/src/parser_bison.y index 2a39db31..8026708e 100644 --- a/src/parser_bison.y +++ b/src/parser_bison.y @@ -48,8 +48,6 @@ void parser_init(struct nft_ctx *nft, struct parser_state *state, state->msgs = msgs; state->cmds = cmds; state->scopes[0] = scope_init(&state->top_scope, NULL); - state->ectx.nft = nft; - state->ectx.msgs = msgs; init_list_head(&state->indesc_list); } @@ -792,17 +790,8 @@ input : /* empty */ | input line { if ($2 != NULL) { - LIST_HEAD(list); - $2->location = @2; - - list_add_tail(&$2->list, &list); - if (cmd_evaluate(&state->ectx, $2) < 0) { - cmd_free($2); - if (++state->nerrs == nft->parser_max_errors) - YYABORT; - } else - list_splice_tail(&list, state->cmds); + list_add_tail(&$2->list, state->cmds); } } ; @@ -878,22 +867,10 @@ line : common_block { $$ = NULL; } * work. */ if ($1 != NULL) { - LIST_HEAD(list); - $1->location = @1; - - list_add_tail(&$1->list, &list); - if (cmd_evaluate(&state->ectx, $1) < 0) { - cmd_free($1); - if (++state->nerrs == nft->parser_max_errors) - YYABORT; - } else - list_splice_tail(&list, state->cmds); + list_add_tail(&$1->list, state->cmds); } - if (state->nerrs) - YYABORT; $$ = NULL; - YYACCEPT; } ; |