From 55ee009aaa650553868509081f2e2c5e2915008c Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Tue, 16 Sep 2014 11:03:57 +0200 Subject: 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 :1:14-16: Error: syntax error, unexpected string, expecting end of file or newline or semicolon describe tcp foo ^^^ Reported-by: Kevin Fenzi Signed-off-by: Pablo Neira Ayuso --- src/evaluate.c | 1 + src/parser.y | 19 +++++++++++-------- src/rule.c | 11 +++++++++++ 3 files changed, 23 insertions(+), 8 deletions(-) (limited to 'src') 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 line %destructor { cmd_free($$); } line -%type 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 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 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; diff --git a/src/rule.c b/src/rule.c index cb2a2285..80deb1b9 100644 --- a/src/rule.c +++ b/src/rule.c @@ -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); } -- cgit v1.2.3