]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
json: don't BUG when asked to list synproxies
authorFlorian Westphal <fw@strlen.de>
Thu, 27 Mar 2025 16:32:00 +0000 (17:32 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Wed, 13 Aug 2025 16:28:33 +0000 (18:28 +0200)
commit 40b0708ca6dee4829a9b6e1c2f4677ff2c206b43 upstream.

"-j list synproxys" triggers a BUG().

Rewrite this so that all enum values are handled so the compiler can alert
us to a missing value in case there are more commands in the future.

While at it, implement a few low-hanging fruites as well.

Not-yet-supported cases are simply ignored.

v2: return EOPNOTSUPP for unsupported commands (Pablo Neira Ayuso)

Signed-off-by: Florian Westphal <fw@strlen.de>
Reviewed-by: Pablo Neira Ayuso <pablo@netfilter.org>
src/evaluate.c
src/json.c
src/rule.c

index 560db873a0c7ac397de511b4ed43e3a3a0275eca..641cd0d5bd02a8d176495d9345133bd5826ccd4a 100644 (file)
@@ -6093,7 +6093,9 @@ int cmd_evaluate(struct eval_ctx *ctx, struct cmd *cmd)
                return cmd_evaluate_monitor(ctx, cmd);
        case CMD_IMPORT:
                return cmd_evaluate_import(ctx, cmd);
-       default:
-               BUG("invalid command operation %u\n", cmd->op);
+       case CMD_INVALID:
+               break;
        };
+
+       BUG("invalid command operation %u\n", cmd->op);
 }
index 9c39e418fc53f6dc48df3993020062d2da5b35b9..bae3fd5f4f6edc276c8e1533330b34f0fe0de8f6 100644 (file)
@@ -1958,7 +1958,7 @@ static json_t *generate_json_metainfo(void)
 int do_command_list_json(struct netlink_ctx *ctx, struct cmd *cmd)
 {
        struct table *table = NULL;
-       json_t *root;
+       json_t *root = NULL;
 
        if (cmd->handle.table.name) {
                table = table_cache_find(&ctx->nft->cache.table_cache,
@@ -2017,6 +2017,13 @@ int do_command_list_json(struct netlink_ctx *ctx, struct cmd *cmd)
        case CMD_OBJ_CT_HELPERS:
                root = do_list_obj_json(ctx, cmd, NFT_OBJECT_CT_HELPER);
                break;
+       case CMD_OBJ_CT_TIMEOUT:
+       case CMD_OBJ_CT_TIMEOUTS:
+               root = do_list_obj_json(ctx, cmd, NFT_OBJECT_CT_TIMEOUT);
+       case CMD_OBJ_CT_EXPECT:
+       case CMD_OBJ_CT_EXPECTATIONS:
+               root = do_list_obj_json(ctx, cmd, NFT_OBJECT_CT_EXPECT);
+               break;
        case CMD_OBJ_LIMIT:
        case CMD_OBJ_LIMITS:
                root = do_list_obj_json(ctx, cmd, NFT_OBJECT_LIMIT);
@@ -2025,14 +2032,29 @@ int do_command_list_json(struct netlink_ctx *ctx, struct cmd *cmd)
        case CMD_OBJ_SECMARKS:
                root = do_list_obj_json(ctx, cmd, NFT_OBJECT_SECMARK);
                break;
+       case CMD_OBJ_SYNPROXY:
+       case CMD_OBJ_SYNPROXYS:
+               root = do_list_obj_json(ctx, cmd, NFT_OBJECT_SYNPROXY);
+               break;
        case CMD_OBJ_FLOWTABLE:
                root = do_list_flowtable_json(ctx, cmd, table);
                break;
        case CMD_OBJ_FLOWTABLES:
                root = do_list_flowtables_json(ctx, cmd);
                break;
-       default:
+       case CMD_OBJ_HOOKS:
+               return 0;
+       case CMD_OBJ_MONITOR:
+       case CMD_OBJ_MARKUP:
+       case CMD_OBJ_SETELEMS:
+       case CMD_OBJ_RULE:
+       case CMD_OBJ_EXPR:
+       case CMD_OBJ_ELEMENTS:
+               errno = EOPNOTSUPP;
+               return -1;
+       case CMD_OBJ_INVALID:
                BUG("invalid command object type %u\n", cmd->obj);
+               break;
        }
 
        if (!json_is_array(root)) {
index 6c81106d49a652caa54e75f0f677cd0e302c02a4..e24f7f274ddd2fd6a172a8a68a099a122e405cb9 100644 (file)
@@ -2545,6 +2545,7 @@ static int do_command_list(struct netlink_ctx *ctx, struct cmd *cmd)
        case CMD_OBJ_SET:
                return do_list_set(ctx, cmd, table);
        case CMD_OBJ_RULESET:
+       case CMD_OBJ_RULE:
                return do_list_ruleset(ctx, cmd);
        case CMD_OBJ_METERS:
                return do_list_sets(ctx, cmd);
@@ -2584,10 +2585,18 @@ static int do_command_list(struct netlink_ctx *ctx, struct cmd *cmd)
                return do_list_flowtables(ctx, cmd);
        case CMD_OBJ_HOOKS:
                return do_list_hooks(ctx, cmd);
-       default:
-               BUG("invalid command object type %u\n", cmd->obj);
+       case CMD_OBJ_MONITOR:
+       case CMD_OBJ_MARKUP:
+       case CMD_OBJ_SETELEMS:
+       case CMD_OBJ_EXPR:
+       case CMD_OBJ_ELEMENTS:
+               errno = EOPNOTSUPP;
+               return -1;
+       case CMD_OBJ_INVALID:
+               break;
        }
 
+       BUG("invalid command object type %u\n", cmd->obj);
        return 0;
 }