]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
ct timeout: fix 'list object x' vs. 'list objects in table' confusion
authorFlorian Westphal <fw@strlen.de>
Mon, 19 Jun 2023 20:43:06 +0000 (22:43 +0200)
committerFlorian Westphal <fw@strlen.de>
Tue, 20 Jun 2023 19:47:53 +0000 (21:47 +0200)
<empty ruleset>
$ nft list ct timeout table t
Error: No such file or directory
list ct timeout table t
                      ^
This is expected to list all 'ct timeout' objects.
The failure is correct, the table 't' does not exist.

But now lets add one:
$ nft add table t
$ nft list ct timeout  table t
Segmentation fault (core dumped)

... and thats not expected, nothing should be shown
and nft should exit normally.

Because of missing TIMEOUTS command enum, the backend thinks
it should do an object lookup, but as frontend asked for
'list of objects' rather than 'show this object',
handle.obj.name is NULL, which then results in this crash.

Update the command enums so that backend knows what the
frontend asked for.

Signed-off-by: Florian Westphal <fw@strlen.de>
include/rule.h
src/cache.c
src/evaluate.c
src/parser_bison.y
src/rule.c

index fa391529875089959480765243c0647d42e9b1d9..b360e2614c78320b043223833e94f71e1aeab1c0 100644 (file)
@@ -645,6 +645,7 @@ enum cmd_obj {
        CMD_OBJ_FLOWTABLE,
        CMD_OBJ_FLOWTABLES,
        CMD_OBJ_CT_TIMEOUT,
+       CMD_OBJ_CT_TIMEOUTS,
        CMD_OBJ_SECMARK,
        CMD_OBJ_SECMARKS,
        CMD_OBJ_CT_EXPECT,
index becfa57fc33538aa6d3941b39b606f3d101123a9..d908ae0ad1920aa0121c2bfd58312933f5223a35 100644 (file)
@@ -370,6 +370,7 @@ static int nft_handle_validate(const struct cmd *cmd, struct list_head *msgs)
        case CMD_OBJ_CT_HELPER:
        case CMD_OBJ_CT_HELPERS:
        case CMD_OBJ_CT_TIMEOUT:
+       case CMD_OBJ_CT_TIMEOUTS:
        case CMD_OBJ_CT_EXPECT:
                if (h->table.name &&
                    strlen(h->table.name) > NFT_NAME_MAXLEN) {
index efab28952e32e0dcd3d9c2be32e7d47788299521..687f9a7b59240b3c9038b8da8bd6d13cec254c47 100644 (file)
@@ -5441,6 +5441,7 @@ static int cmd_evaluate_list(struct eval_ctx *ctx, struct cmd *cmd)
        case CMD_OBJ_FLOWTABLES:
        case CMD_OBJ_SECMARKS:
        case CMD_OBJ_SYNPROXYS:
+       case CMD_OBJ_CT_TIMEOUTS:
                if (cmd->handle.table.name == NULL)
                        return 0;
                if (!table_cache_find(&ctx->nft->cache.table_cache,
index e7ee56c17fec4f2c8398f3183f7f45c23a573973..beb277b68288e27f2e1284514fd067156de3ac83 100644 (file)
@@ -4757,7 +4757,7 @@ ct_obj_type               :       HELPER          { $$ = NFT_OBJECT_CT_HELPER; }
                        ;
 
 ct_cmd_type            :       HELPERS         { $$ = CMD_OBJ_CT_HELPERS; }
-                       |       TIMEOUT         { $$ = CMD_OBJ_CT_TIMEOUT; }
+                       |       TIMEOUT         { $$ = CMD_OBJ_CT_TIMEOUTS; }
                        |       EXPECTATION     { $$ = CMD_OBJ_CT_EXPECT; }
                        ;
 
index 1faa1a27f38ecb925275218384601dcc01bbf5e1..3704600a87be4b00d7fe2abff3cff3eaca7442dc 100644 (file)
@@ -2351,6 +2351,7 @@ static int do_command_list(struct netlink_ctx *ctx, struct cmd *cmd)
        case CMD_OBJ_CT_HELPERS:
                return do_list_obj(ctx, cmd, NFT_OBJECT_CT_HELPER);
        case CMD_OBJ_CT_TIMEOUT:
+       case CMD_OBJ_CT_TIMEOUTS:
                return do_list_obj(ctx, cmd, NFT_OBJECT_CT_TIMEOUT);
        case CMD_OBJ_CT_EXPECT:
                return do_list_obj(ctx, cmd, NFT_OBJECT_CT_EXPECT);