summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2025-08-13 15:20:30 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2025-08-27 23:52:08 +0200
commitf46a6e948bf004d0b0379aded20726daab83afe2 (patch)
treefe16750937170366834b0a0bacd591b1476ab428
parent458945e475f22e561151cca3c9580f42e12ac7ab (diff)
expression: replace compound_expr_destroy() by type safe funtion
Replace it by {set,list,concat}_expr_destroy() to validate type. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r--src/expression.c35
1 files changed, 23 insertions, 12 deletions
diff --git a/src/expression.c b/src/expression.c
index 016dfaa2..d9456d6b 100644
--- a/src/expression.c
+++ b/src/expression.c
@@ -90,7 +90,7 @@ void expr_free(struct expr *expr)
datatype_free(expr->dtype);
/* EXPR_INVALID expressions lack ->ops structure.
- * This happens for compound types.
+ * This happens for set, list and concat types.
*/
if (expr->etype != EXPR_INVALID)
expr_destroy(expr);
@@ -1027,14 +1027,6 @@ struct expr *compound_expr_alloc(const struct location *loc,
return expr;
}
-static void compound_expr_destroy(struct expr *expr)
-{
- struct expr *i, *next;
-
- list_for_each_entry_safe(i, next, &expr->expr_set.expressions, list)
- expr_free(i);
-}
-
static void compound_expr_print(const struct expr *expr, const char *delim,
struct output_ctx *octx)
{
@@ -1050,7 +1042,10 @@ static void compound_expr_print(const struct expr *expr, const char *delim,
static void concat_expr_destroy(struct expr *expr)
{
- compound_expr_destroy(expr);
+ struct expr *i, *next;
+
+ list_for_each_entry_safe(i, next, &expr_concat(expr)->expressions, list)
+ expr_free(i);
}
static void concat_expr_print(const struct expr *expr, struct output_ctx *octx)
@@ -1261,13 +1256,21 @@ static void list_expr_clone(struct expr *new, const struct expr *expr)
list_expr_add(new, expr_clone(i));
}
+static void list_expr_destroy(struct expr *expr)
+{
+ struct expr *i, *next;
+
+ list_for_each_entry_safe(i, next, &expr_list(expr)->expressions, list)
+ expr_free(i);
+}
+
static const struct expr_ops list_expr_ops = {
.type = EXPR_LIST,
.name = "list",
.print = list_expr_print,
.json = list_expr_json,
.clone = list_expr_clone,
- .destroy = compound_expr_destroy,
+ .destroy = list_expr_destroy,
};
struct expr *list_expr_alloc(const struct location *loc)
@@ -1393,6 +1396,14 @@ static void set_expr_clone(struct expr *new, const struct expr *expr)
set_expr_add(new, expr_clone(i));
}
+static void set_expr_destroy(struct expr *expr)
+{
+ struct expr *i, *next;
+
+ list_for_each_entry_safe(i, next, &expr_set(expr)->expressions, list)
+ expr_free(i);
+}
+
static void set_expr_set_type(const struct expr *expr,
const struct datatype *dtype,
enum byteorder byteorder)
@@ -1410,7 +1421,7 @@ static const struct expr_ops set_expr_ops = {
.json = set_expr_json,
.set_type = set_expr_set_type,
.clone = set_expr_clone,
- .destroy = compound_expr_destroy,
+ .destroy = set_expr_destroy,
};
struct expr *set_expr_alloc(const struct location *loc, const struct set *set)