summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2025-08-13 15:11:09 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2025-08-27 23:52:08 +0200
commit75ab7957feb78c53641331587f0f2ca8d75ccf8c (patch)
tree4c25ccf77786112e07fad28cecf496a344c3a552
parentf011884543475ff3c12ae61cc6d7dde57df25305 (diff)
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 <pablo@netfilter.org>
-rw-r--r--include/expression.h3
-rw-r--r--src/evaluate.c2
-rw-r--r--src/intervals.c12
-rw-r--r--src/segtree.c2
4 files changed, 11 insertions, 8 deletions
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;