diff options
author | Florian Westphal <fw@strlen.de> | 2023-06-19 22:43:02 +0200 |
---|---|---|
committer | Florian Westphal <fw@strlen.de> | 2023-06-20 21:44:50 +0200 |
commit | 75217cb7bb78e22fc9317116353149def8a306e9 (patch) | |
tree | cd8897073e6de94f3f1aa0fcbf4eeabc150bf84a /src | |
parent | e5bf0485ff1ba0f2ff2fb3b03cfed1f98953dc1b (diff) |
evaluate: do not abort when prefix map has non-map element
Before:
nft: evaluate.c:1849: __mapping_expr_expand: Assertion `i->etype == EXPR_MAPPING' failed.
after:
Error: expected mapping, not set element
snat ip prefix to ip saddr map { 10.141.11.0/24 : 192.168.2.0/24, 10.141.12.1 }
Signed-off-by: Florian Westphal <fw@strlen.de>
Diffstat (limited to 'src')
-rw-r--r-- | src/evaluate.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/evaluate.c b/src/evaluate.c index 00bb8988..efab2895 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -1869,12 +1869,21 @@ static void __mapping_expr_expand(struct expr *i) } } -static void mapping_expr_expand(struct expr *init) +static int mapping_expr_expand(struct eval_ctx *ctx) { struct expr *i; - list_for_each_entry(i, &init->expressions, list) + if (!set_is_anonymous(ctx->set->flags)) + return 0; + + list_for_each_entry(i, &ctx->set->init->expressions, list) { + if (i->etype != EXPR_MAPPING) + return expr_error(ctx->msgs, i, + "expected mapping, not %s", expr_name(i)); __mapping_expr_expand(i); + } + + return 0; } static int expr_evaluate_map(struct eval_ctx *ctx, struct expr **expr) @@ -1955,8 +1964,8 @@ static int expr_evaluate_map(struct eval_ctx *ctx, struct expr **expr) if (ctx->set->data->flags & EXPR_F_INTERVAL) { ctx->set->data->len *= 2; - if (set_is_anonymous(ctx->set->flags)) - mapping_expr_expand(ctx->set->init); + if (mapping_expr_expand(ctx)) + return -1; } ctx->set->key->len = ctx->ectx.len; |