summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Westphal <fw@strlen.de>2025-03-27 17:32:00 +0100
committerPablo Neira Ayuso <pablo@netfilter.org>2025-08-13 18:28:33 +0200
commitef9eb63b0d0e7ed91049ace1d9b4cab52627e080 (patch)
tree1b158ebb27bb7ee48aeb246cacaa7314b97846a2
parent705c84e5de96d78b55823de36f90b65bbc857930 (diff)
json: don't BUG when asked to list synproxies
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>
-rw-r--r--src/evaluate.c6
-rw-r--r--src/json.c26
-rw-r--r--src/rule.c13
3 files changed, 39 insertions, 6 deletions
diff --git a/src/evaluate.c b/src/evaluate.c
index 560db873..641cd0d5 100644
--- a/src/evaluate.c
+++ b/src/evaluate.c
@@ -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);
}
diff --git a/src/json.c b/src/json.c
index 9c39e418..bae3fd5f 100644
--- a/src/json.c
+++ b/src/json.c
@@ -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)) {
diff --git a/src/rule.c b/src/rule.c
index 6c81106d..e24f7f27 100644
--- a/src/rule.c
+++ b/src/rule.c
@@ -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;
}