summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2025-08-13 15:19:56 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2025-08-27 23:52:08 +0200
commit458945e475f22e561151cca3c9580f42e12ac7ab (patch)
treea4375385c2259042074de912b3ea0d88b58e948b
parentb289d636e4bf619ae21562b74dd5ff9fa895b514 (diff)
expression: replace compound_expr_remove() by type safe function
Replace this function by {list,concat,set}_expr_remove() to validate expression type. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r--include/expression.h4
-rw-r--r--src/expression.c24
-rw-r--r--src/segtree.c6
3 files changed, 24 insertions, 10 deletions
diff --git a/include/expression.h b/include/expression.h
index d36eea97..32812d28 100644
--- a/include/expression.h
+++ b/include/expression.h
@@ -525,21 +525,23 @@ struct expr *range_expr_to_prefix(struct expr *range);
extern struct expr *compound_expr_alloc(const struct location *loc,
enum expr_types etypes);
-extern void compound_expr_remove(struct expr *compound, struct expr *expr);
extern void list_expr_sort(struct list_head *head);
extern void list_splice_sorted(struct list_head *list, struct list_head *head);
extern struct expr *concat_expr_alloc(const struct location *loc);
void concat_expr_add(struct expr *concat, struct expr *item);
+void concat_expr_remove(struct expr *concat, struct expr *expr);
extern struct expr *list_expr_alloc(const struct location *loc);
void list_expr_add(struct expr *expr, struct expr *item);
+void list_expr_remove(struct expr *expr, struct expr *item);
struct expr *list_expr_to_binop(struct expr *expr);
extern struct expr *set_expr_alloc(const struct location *loc,
const struct set *set);
void __set_expr_add(struct expr *set, struct expr *elem);
void set_expr_add(struct expr *set, struct expr *elem);
+void set_expr_remove(struct expr *expr, struct expr *item);
extern void concat_range_aggregate(struct expr *set);
extern void interval_map_decompose(struct expr *set);
diff --git a/src/expression.c b/src/expression.c
index bceb2a32..016dfaa2 100644
--- a/src/expression.c
+++ b/src/expression.c
@@ -1048,12 +1048,6 @@ static void compound_expr_print(const struct expr *expr, const char *delim,
}
}
-void compound_expr_remove(struct expr *compound, struct expr *expr)
-{
- compound->expr_set.size--;
- list_del(&expr->list);
-}
-
static void concat_expr_destroy(struct expr *expr)
{
compound_expr_destroy(expr);
@@ -1247,6 +1241,12 @@ void concat_expr_add(struct expr *concat, struct expr *item)
expr_concat->size++;
}
+void concat_expr_remove(struct expr *concat, struct expr *expr)
+{
+ expr_concat(concat)->size--;
+ list_del(&expr->list);
+}
+
static void list_expr_print(const struct expr *expr, struct output_ctx *octx)
{
compound_expr_print(expr, ",", octx);
@@ -1283,6 +1283,12 @@ void list_expr_add(struct expr *expr, struct expr *item)
expr_list->size++;
}
+void list_expr_remove(struct expr *list, struct expr *expr)
+{
+ expr_list(list)->size--;
+ list_del(&expr->list);
+}
+
/* list is assumed to have two items at least, otherwise extend this! */
struct expr *list_expr_to_binop(struct expr *expr)
{
@@ -1433,6 +1439,12 @@ void set_expr_add(struct expr *set, struct expr *elem)
expr_set->size++;
}
+void set_expr_remove(struct expr *set, struct expr *expr)
+{
+ expr_set(set)->size--;
+ list_del(&expr->list);
+}
+
static void mapping_expr_print(const struct expr *expr, struct output_ctx *octx)
{
expr_print(expr->left, octx);
diff --git a/src/segtree.c b/src/segtree.c
index e6b14f5d..88207a39 100644
--- a/src/segtree.c
+++ b/src/segtree.c
@@ -448,13 +448,13 @@ next:
mpz_clear(range);
r2 = list_entry(r2_next, typeof(*r2), list);
- compound_expr_remove(expr_value(start), r1);
+ concat_expr_remove(expr_value(start), r1);
if (free_r1)
expr_free(r1);
}
- compound_expr_remove(set, start);
+ set_expr_remove(set, start);
expr_free(start);
start = NULL;
}
@@ -584,7 +584,7 @@ void interval_map_decompose(struct expr *set)
catchall = i;
continue;
}
- compound_expr_remove(set, i);
+ set_expr_remove(set, i);
elements[n++] = i;
}
qsort(elements, n, sizeof(elements[0]), expr_value_cmp);