diff options
author | Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com> | 2013-09-04 12:50:20 +0300 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2013-09-05 11:01:40 +0200 |
commit | f314b4500848d90836cb3d936333bba5a0357ed7 (patch) | |
tree | 287dae4aa539e31800dfa56630372a5e3a440e54 | |
parent | 78c4b630124ee09dff17026b3e2cd5820942093b (diff) |
src: Better error reporting if chain type is invalid
This patch verifies at command line parsing that given chain type
is valid. Possibilities are: filter, nat, and route.
nft add chain test test { type cheese hook input priority 0 };
<cmdline>:1:28-33: Error: unknown chain type cheese
add chain test test { type cheese hook input priority 0 };
^^^^^^
Signed-off-by: Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r-- | include/rule.h | 1 | ||||
-rw-r--r-- | src/parser.y | 16 | ||||
-rw-r--r-- | src/rule.c | 19 |
3 files changed, 33 insertions, 3 deletions
diff --git a/include/rule.h b/include/rule.h index 1de23dce..10cfebde 100644 --- a/include/rule.h +++ b/include/rule.h @@ -117,6 +117,7 @@ struct chain { struct list_head rules; }; +extern const char *chain_type_name_lookup(const char *name); extern const char *chain_hookname_lookup(const char *name); extern struct chain *chain_alloc(const char *name); extern void chain_free(struct chain *chain); diff --git a/src/parser.y b/src/parser.y index a7dfdcc4..074f0758 100644 --- a/src/parser.y +++ b/src/parser.y @@ -769,10 +769,15 @@ map_block : /* empty */ { $$ = $<set>-1; } hook_spec : TYPE STRING HOOK STRING PRIORITY NUM { - $<chain>0->type = $2; + $<chain>0->type = chain_type_name_lookup($2); + if ($<chain>0->type == NULL) { + erec_queue(error(&@2, "unknown chain type %s", $2), + state->msgs); + YYERROR; + } $<chain>0->hookstr = chain_hookname_lookup($4); if ($<chain>0->hookstr == NULL) { - erec_queue(error(&@4, "unknown hook name %s", $4), + erec_queue(error(&@4, "unknown chain type %s", $4), state->msgs); YYERROR; } @@ -781,7 +786,12 @@ hook_spec : TYPE STRING HOOK STRING PRIORITY NUM } | TYPE STRING HOOK STRING PRIORITY DASH NUM { - $<chain>0->type = $2; + $<chain>0->type = chain_type_name_lookup($2); + if ($<chain>0->type == NULL) { + erec_queue(error(&@2, "unknown type name %s", $2), + state->msgs); + YYERROR; + } $<chain>0->hookstr = chain_hookname_lookup($4); if ($<chain>0->hookstr == NULL) { erec_queue(error(&@4, "unknown hook name %s", $4), @@ -190,6 +190,25 @@ struct symbol *symbol_lookup(const struct scope *scope, const char *identifier) return NULL; } +static const char *chain_type_str_array[] = { + "filter", + "nat", + "route", + NULL, +}; + +const char *chain_type_name_lookup(const char *name) +{ + int i; + + for (i = 0; chain_type_str_array[i]; i++) { + if (!strcmp(name, chain_type_str_array[i])) + return chain_type_str_array[i]; + } + + return NULL; +} + static const char *chain_hookname_str_array[] = { "prerouting", "input", |