diff options
author | Pablo Neira Ayuso <pablo@netfilter.org> | 2014-09-16 11:03:57 +0200 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2014-09-17 10:17:38 +0200 |
commit | 55ee009aaa650553868509081f2e2c5e2915008c (patch) | |
tree | d9217f803b7b801f063b0f1204f7eab55bbbee9f /src | |
parent | 102c30013e622a9ffdccace52dee2552b06e5d3d (diff) |
src: fix 'describe' command when passing wrong expressions
Before this patch:
# nft describe tcp foo
value expression, datatype inet_proto (Internet protocol) (basetype integer), 8 bits
Segmentation fault
After this patch:
# nft describe tcp foo
<cmdline>:1:14-16: Error: syntax error, unexpected string, expecting end of file or newline or semicolon
describe tcp foo
^^^
Reported-by: Kevin Fenzi <kevin@scrye.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/evaluate.c | 1 | ||||
-rw-r--r-- | src/parser.y | 19 | ||||
-rw-r--r-- | src/rule.c | 11 |
3 files changed, 23 insertions, 8 deletions
diff --git a/src/evaluate.c b/src/evaluate.c index f66a8ea3..34558fcb 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -1443,6 +1443,7 @@ int cmd_evaluate(struct eval_ctx *ctx, struct cmd *cmd) case CMD_RENAME: case CMD_EXPORT: case CMD_MONITOR: + case CMD_DESCRIBE: return 0; default: BUG("invalid command operation %u\n", cmd->op); diff --git a/src/parser.y b/src/parser.y index 653c7649..ac3d890f 100644 --- a/src/parser.y +++ b/src/parser.y @@ -383,8 +383,8 @@ static void location_update(struct location *loc, struct location *rhs, int n) %type <cmd> line %destructor { cmd_free($$); } line -%type <cmd> base_cmd add_cmd create_cmd insert_cmd delete_cmd list_cmd flush_cmd rename_cmd export_cmd monitor_cmd -%destructor { cmd_free($$); } base_cmd add_cmd create_cmd insert_cmd delete_cmd list_cmd flush_cmd rename_cmd export_cmd monitor_cmd +%type <cmd> base_cmd add_cmd create_cmd insert_cmd delete_cmd list_cmd flush_cmd rename_cmd export_cmd monitor_cmd describe_cmd +%destructor { cmd_free($$); } base_cmd add_cmd create_cmd insert_cmd delete_cmd list_cmd flush_cmd rename_cmd export_cmd monitor_cmd describe_cmd %type <handle> table_spec tables_spec chain_spec chain_identifier ruleid_spec ruleset_spec %destructor { handle_free(&$$); } table_spec tables_spec chain_spec chain_identifier ruleid_spec ruleset_spec @@ -614,12 +614,7 @@ base_cmd : /* empty */ add_cmd { $$ = $1; } | RENAME rename_cmd { $$ = $2; } | EXPORT export_cmd { $$ = $2; } | MONITOR monitor_cmd { $$ = $2; } - | DESCRIBE primary_expr - { - expr_describe($2); - expr_free($2); - $$ = NULL; - } + | DESCRIBE describe_cmd { $$ = $2; } ; add_cmd : TABLE table_spec @@ -865,6 +860,14 @@ monitor_object : /* empty */ } ; +describe_cmd : primary_expr + { + struct handle h = { .family = NFPROTO_UNSPEC }; + $$ = cmd_alloc(CMD_DESCRIBE, CMD_OBJ_EXPR, &h, &@$, NULL); + $$->expr = $1; + } + ; + output_format : /* empty */ { $$ = NFT_OUTPUT_DEFAULT; @@ -548,6 +548,9 @@ void cmd_free(struct cmd *cmd) case CMD_OBJ_TABLE: table_free(cmd->table); break; + case CMD_OBJ_EXPR: + expr_free(cmd->expr); + break; default: BUG("invalid command object type %u\n", cmd->obj); } @@ -909,6 +912,12 @@ static int do_command_monitor(struct netlink_ctx *ctx, struct cmd *cmd) return netlink_monitor(&monhandler); } +static int do_command_describe(struct netlink_ctx *ctx, struct cmd *cmd) +{ + expr_describe(cmd->expr); + return 0; +} + int do_command(struct netlink_ctx *ctx, struct cmd *cmd) { switch (cmd->op) { @@ -930,6 +939,8 @@ int do_command(struct netlink_ctx *ctx, struct cmd *cmd) return do_command_export(ctx, cmd); case CMD_MONITOR: return do_command_monitor(ctx, cmd); + case CMD_DESCRIBE: + return do_command_describe(ctx, cmd); default: BUG("invalid command object type %u\n", cmd->obj); } |