From: Pablo Neira Ayuso Date: Wed, 13 Aug 2025 13:11:09 +0000 (+0200) Subject: src: add expr_type_catchall() helper and use it X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=75ab7957feb78c53641331587f0f2ca8d75ccf8c;p=thirdparty%2Fnftables.git src: add expr_type_catchall() helper and use it Add helper function to check if this is a catchall expression. Signed-off-by: Pablo Neira Ayuso --- diff --git a/include/expression.h b/include/expression.h index 7185ee66..acd0fd3d 100644 --- a/include/expression.h +++ b/include/expression.h @@ -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); diff --git a/src/evaluate.c b/src/evaluate.c index 6bf14b0c..cb05e694 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -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); diff --git a/src/intervals.c b/src/intervals.c index 8c8ce8c8..d5afffd2 100644 --- a/src/intervals.c +++ b/src/intervals.c @@ -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; } diff --git a/src/segtree.c b/src/segtree.c index fd77e03f..607f002f 100644 --- a/src/segtree.c +++ b/src/segtree.c @@ -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;