diff options
| author | Florian Westphal <fw@strlen.de> | 2025-03-27 17:32:00 +0100 |
|---|---|---|
| committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2025-08-13 18:28:33 +0200 |
| commit | ef9eb63b0d0e7ed91049ace1d9b4cab52627e080 (patch) | |
| tree | 1b158ebb27bb7ee48aeb246cacaa7314b97846a2 | |
| parent | 705c84e5de96d78b55823de36f90b65bbc857930 (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.c | 6 | ||||
| -rw-r--r-- | src/json.c | 26 | ||||
| -rw-r--r-- | src/rule.c | 13 |
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); } @@ -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)) { @@ -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; } |
