]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
evaluate: simplify sets as set elems evaluation
authorPablo Neira Ayuso <pablo@netfilter.org>
Thu, 5 Feb 2026 02:41:13 +0000 (03:41 +0100)
committerFlorian Westphal <fw@strlen.de>
Tue, 10 Feb 2026 17:22:01 +0000 (18:22 +0100)
After normalizing set element representation for EXPR_MAPPING, it is
possible to simplify:

  a6b75b837f5e ("evaluate: set: Allow for set elems to be sets")

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

index f0a82a2c46eb7ed5da34769d9106a2447f082662..556664d640a38385b5c755cd340e104b276c3fde 100644 (file)
@@ -2101,27 +2101,17 @@ static int expr_evaluate_set(struct eval_ctx *ctx, struct expr **expr)
                        return expr_error(ctx->msgs, i,
                                          "Set reference cannot be part of another set");
 
-               if (elem->etype == EXPR_SET_ELEM &&
-                   elem->key->etype == EXPR_SET) {
-                       struct expr *new = expr_get(elem->key);
-
-                       expr_set(set)->set_flags |= expr_set(elem->key)->set_flags;
-                       list_replace(&i->list, &new->list);
-                       expr_free(i);
-                       i = new;
-                       elem = i;
-               }
-
                if (!expr_is_constant(i))
                        return expr_error(ctx->msgs, i,
                                          "Set member is not constant");
 
-               if (i->etype == EXPR_SET) {
+               if (i->etype == EXPR_SET_ELEM &&
+                   i->key->etype == EXPR_SET) {
                        /* Merge recursive set definitions */
-                       list_splice_tail_init(&expr_set(i)->expressions, &i->list);
+                       list_splice_tail_init(&expr_set(i->key)->expressions, &i->list);
                        list_del(&i->list);
-                       expr_set(set)->size      += expr_set(i)->size - 1;
-                       expr_set(set)->set_flags |= expr_set(i)->set_flags;
+                       expr_set(set)->size      += expr_set(i->key)->size - 1;
+                       expr_set(set)->set_flags |= expr_set(i->key)->set_flags;
                        expr_free(i);
                } else if (!expr_is_singleton(i)) {
                        expr_set(set)->set_flags |= NFT_SET_INTERVAL;