summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomasz Bursztyka <tomasz.bursztyka@linux.intel.com>2013-09-04 12:50:20 +0300
committerPablo Neira Ayuso <pablo@netfilter.org>2013-09-05 11:01:40 +0200
commitf314b4500848d90836cb3d936333bba5a0357ed7 (patch)
tree287dae4aa539e31800dfa56630372a5e3a440e54
parent78c4b630124ee09dff17026b3e2cd5820942093b (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.h1
-rw-r--r--src/parser.y16
-rw-r--r--src/rule.c19
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),
diff --git a/src/rule.c b/src/rule.c
index 42ba37f4..2cf024a4 100644
--- a/src/rule.c
+++ b/src/rule.c
@@ -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",