]> 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)
committerFlorian Westphal <fw@strlen.de>
Thu, 27 Mar 2025 21:29:25 +0000 (22:29 +0100)
"-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 ffb23005a68ef4f5f7a2f54a9fea31d5693b3749..0db3d80f8b56ffa05a65c30d308fcc7940d4dbe4 100644 (file)
@@ -6302,7 +6302,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 bcdcd56b156834b79507026851e933cdd3057fff..41a572018841923c5fccbcf31be2cb1667e3aa07 100644 (file)
@@ -1957,7 +1957,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 00fbbc4c080a5ebd44aa8804545e745fc26668f0..80315837baf067b421f1480632b4660eba56cfbe 100644 (file)
@@ -2445,10 +2445,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;
 }