]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
src: add expr_type_catchall() helper and use it
authorPablo Neira Ayuso <pablo@netfilter.org>
Wed, 13 Aug 2025 13:11:09 +0000 (15:11 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Wed, 27 Aug 2025 21:52:08 +0000 (23:52 +0200)
Add helper function to check if this is a catchall expression.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/expression.h
src/evaluate.c
src/intervals.c
src/segtree.c

index 7185ee66a018985348240a4ad72c7c2b41123ada..acd0fd3d14fa931a9997535d56fde218207e5c16 100644 (file)
@@ -558,6 +558,9 @@ extern struct expr *set_elem_expr_alloc(const struct location *loc,
 
 struct expr *set_elem_catchall_expr_alloc(const struct location *loc);
 
+#define expr_type_catchall(__expr)                     \
+       ((__expr)->etype == EXPR_SET_ELEM_CATCHALL)
+
 extern void range_expr_value_low(mpz_t rop, const struct expr *expr);
 extern void range_expr_value_high(mpz_t rop, const struct expr *expr);
 void range_expr_swap_values(struct expr *range);
index 6bf14b0cdba47fcf9aebc594383fda49af62aeb6..cb05e694bc51d0317485eaa2babb4cf32b3e6534 100644 (file)
@@ -1929,7 +1929,7 @@ static bool elem_key_compatible(const struct expr *set_key,
                                const struct expr *elem_key)
 {
        /* Catchall element is always compatible with the set key declaration */
-       if (elem_key->etype == EXPR_SET_ELEM_CATCHALL)
+       if (expr_type_catchall(elem_key))
                return true;
 
        return datatype_compatible(set_key->dtype, elem_key->dtype);
index 8c8ce8c8a305a0cb7cce5eb13215541c79d8e3f2..d5afffd2120aea7c3cb573065ee48c772b732125 100644 (file)
@@ -175,7 +175,7 @@ static void setelem_automerge(struct set_automerge_ctx *ctx)
        mpz_init(rop);
 
        list_for_each_entry_safe(i, next, &expr_set(ctx->init)->expressions, list) {
-               if (i->key->etype == EXPR_SET_ELEM_CATCHALL)
+               if (expr_type_catchall(i->key))
                        continue;
 
                range_expr_value_low(range.low, i);
@@ -410,7 +410,7 @@ static int setelem_delete(struct list_head *msgs, struct set *set,
        list_for_each_entry_safe(elem, next, &expr_set(elems)->expressions, list) {
                i = interval_expr_key(elem);
 
-               if (i->key->etype == EXPR_SET_ELEM_CATCHALL) {
+               if (expr_type_catchall(i->key)) {
                        /* Assume max value to simplify handling. */
                        mpz_bitmask(range.low, i->len);
                        mpz_bitmask(range.high, i->len);
@@ -574,7 +574,7 @@ static int setelem_overlap(struct list_head *msgs, struct set *set,
        list_for_each_entry_safe(elem, next, &expr_set(init)->expressions, list) {
                i = interval_expr_key(elem);
 
-               if (i->key->etype == EXPR_SET_ELEM_CATCHALL)
+               if (expr_type_catchall(i->key))
                        continue;
 
                range_expr_value_low(range.low, i);
@@ -686,7 +686,7 @@ int set_to_intervals(const struct set *set, struct expr *init, bool add)
        list_for_each_entry_safe(i, n, &expr_set(init)->expressions, list) {
                elem = interval_expr_key(i);
 
-               if (elem->key->etype == EXPR_SET_ELEM_CATCHALL)
+               if (expr_type_catchall(elem->key))
                        continue;
 
                if (prev)
@@ -770,12 +770,12 @@ int setelem_to_interval(const struct set *set, struct expr *elem,
        bool adjacent = false;
 
        key = setelem_key(elem);
-       if (key->etype == EXPR_SET_ELEM_CATCHALL)
+       if (expr_type_catchall(key))
                return 0;
 
        if (next_elem) {
                next_key = setelem_key(next_elem);
-               if (next_key->etype == EXPR_SET_ELEM_CATCHALL)
+               if (expr_type_catchall(next_key))
                        next_key = NULL;
        }
 
index fd77e03fbff520a1e44d466b2d4be17f03d2a78a..607f002f181ec10513df41aa7d79f034837c070f 100644 (file)
@@ -579,7 +579,7 @@ void interval_map_decompose(struct expr *set)
                else if (i->etype == EXPR_MAPPING)
                        key = i->left->key;
 
-               if (key && key->etype == EXPR_SET_ELEM_CATCHALL) {
+               if (key && expr_type_catchall(key)) {
                        list_del(&i->list);
                        catchall = i;
                        continue;