summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2025-08-13 15:14:48 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2025-08-27 23:52:08 +0200
commit15479e66d20dda2ddd670159c5ef005320f2398c (patch)
tree4a49dcf5c30cb8969f1efb2d7a8c401f6353fb3c
parentd6bfd4f903f65b9cc72778f343cde4aab0148be6 (diff)
src: replace compound_expr_add() by type safe concat_expr_add()
Replace compound_expr_add by concat_expr_add() to validate type. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r--include/expression.h1
-rw-r--r--src/expression.c10
-rw-r--r--src/netlink.c4
-rw-r--r--src/netlink_delinearize.c6
-rw-r--r--src/optimize.c18
-rw-r--r--src/parser_bison.y4
-rw-r--r--src/parser_json.c6
7 files changed, 29 insertions, 20 deletions
diff --git a/include/expression.h b/include/expression.h
index 4dc6c192..0d9e10d7 100644
--- a/include/expression.h
+++ b/include/expression.h
@@ -531,6 +531,7 @@ 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);
extern struct expr *list_expr_alloc(const struct location *loc);
struct expr *list_expr_to_binop(struct expr *expr);
diff --git a/src/expression.c b/src/expression.c
index 8c5b5176..95cdedaa 100644
--- a/src/expression.c
+++ b/src/expression.c
@@ -1211,7 +1211,7 @@ static struct expr *concat_expr_parse_udata(const struct nftnl_udata *attr)
goto err_free;
dt = concat_subtype_add(dt, expr->dtype->type);
- compound_expr_add(concat_expr, expr);
+ concat_expr_add(concat_expr, expr);
len += netlink_padded_len(expr->len);
}
@@ -1245,6 +1245,14 @@ struct expr *concat_expr_alloc(const struct location *loc)
return compound_expr_alloc(loc, EXPR_CONCAT);
}
+void concat_expr_add(struct expr *concat, struct expr *item)
+{
+ struct expr_concat *expr_concat = expr_concat(concat);
+
+ list_add_tail(&item->list, &expr_concat->expressions);
+ expr_concat->size++;
+}
+
static void list_expr_print(const struct expr *expr, struct output_ctx *octx)
{
compound_expr_print(expr, ",", octx);
diff --git a/src/netlink.c b/src/netlink.c
index 0fa8d1f3..5876c089 100644
--- a/src/netlink.c
+++ b/src/netlink.c
@@ -1366,7 +1366,7 @@ static struct expr *netlink_parse_concat_elem_key(const struct set *set,
concat = concat_expr_alloc(&data->location);
while (off > 0) {
expr = concat_elem_expr(set, n, dtype, data, &off);
- compound_expr_add(concat, expr);
+ concat_expr_add(concat, expr);
if (set->key->etype == EXPR_CONCAT)
n = list_next_entry(n, list);
}
@@ -1405,7 +1405,7 @@ static struct expr *netlink_parse_concat_elem(const struct set *set,
range = range_expr_alloc(&data->location, left, expr);
range = range_expr_reduce(range);
- compound_expr_add(concat, range);
+ concat_expr_add(concat, range);
}
assert(list_empty(&expressions));
} else {
diff --git a/src/netlink_delinearize.c b/src/netlink_delinearize.c
index 5627826d..ccccb67a 100644
--- a/src/netlink_delinearize.c
+++ b/src/netlink_delinearize.c
@@ -128,7 +128,7 @@ static struct expr *netlink_parse_concat_expr(struct netlink_parse_ctx *ctx,
"Relational expression size mismatch");
goto err;
}
- compound_expr_add(concat, expr);
+ concat_expr_add(concat, expr);
consumed = netlink_padded_len(expr->len);
assert(consumed > 0);
@@ -171,7 +171,7 @@ static struct expr *netlink_parse_concat_key(struct netlink_parse_ctx *ctx,
expr_set_type(expr, i, i->byteorder);
}
- compound_expr_add(concat, expr);
+ concat_expr_add(concat, expr);
consumed = netlink_padded_len(expr->len);
assert(consumed > 0);
@@ -204,7 +204,7 @@ static struct expr *netlink_parse_concat_data(struct netlink_parse_ctx *ctx,
}
i = constant_expr_splice(data, expr->len);
data->len -= netlink_padding_len(expr->len);
- compound_expr_add(concat, i);
+ concat_expr_add(concat, i);
len -= netlink_padded_len(expr->len);
reg += netlink_register_space(expr->len);
diff --git a/src/optimize.c b/src/optimize.c
index b2fd9e82..cdd6913a 100644
--- a/src/optimize.c
+++ b/src/optimize.c
@@ -657,7 +657,7 @@ static void __merge_concat(const struct optimize_ctx *ctx, uint32_t i,
list_for_each_entry(expr, &expr_set(stmt_a->expr->right)->expressions, list) {
concat_clone = expr_clone(concat);
clone = expr_clone(expr->key);
- compound_expr_add(concat_clone, clone);
+ concat_expr_add(concat_clone, clone);
list_add_tail(&concat_clone->list, &pending_list);
}
list_del(&concat->list);
@@ -670,13 +670,13 @@ static void __merge_concat(const struct optimize_ctx *ctx, uint32_t i,
case EXPR_RANGE:
case EXPR_RANGE_VALUE:
clone = expr_clone(stmt_a->expr->right);
- compound_expr_add(concat, clone);
+ concat_expr_add(concat, clone);
break;
case EXPR_LIST:
list_for_each_entry(expr, &expr_list(stmt_a->expr->right)->expressions, list) {
concat_clone = expr_clone(concat);
clone = expr_clone(expr);
- compound_expr_add(concat_clone, clone);
+ concat_expr_add(concat_clone, clone);
list_add_tail(&concat_clone->list, &pending_list);
}
list_del(&concat->list);
@@ -720,7 +720,7 @@ static void merge_concat_stmts(const struct optimize_ctx *ctx,
for (k = 0; k < merge->num_stmts; k++) {
stmt_a = ctx->stmt_matrix[from][merge->stmt[k]];
- compound_expr_add(concat, expr_get(stmt_a->expr->left));
+ concat_expr_add(concat, expr_get(stmt_a->expr->left));
}
expr_free(stmt->expr->left);
stmt->expr->left = concat;
@@ -920,7 +920,7 @@ static void merge_concat_stmts_vmap(const struct optimize_ctx *ctx,
concat_a = concat_expr_alloc(&internal_location);
for (i = 0; i < merge->num_stmts; i++) {
stmt_a = ctx->stmt_matrix[from][merge->stmt[i]];
- compound_expr_add(concat_a, expr_get(stmt_a->expr->left));
+ concat_expr_add(concat_a, expr_get(stmt_a->expr->left));
}
/* build set data contenation, eg. { eth0 . 1.1.1.1 . 22 : accept } */
@@ -1021,8 +1021,8 @@ static struct expr *stmt_nat_expr(struct stmt *nat_stmt)
if (nat_stmt->nat.proto) {
if (nat_stmt->nat.addr) {
nat_expr = concat_expr_alloc(&internal_location);
- compound_expr_add(nat_expr, expr_get(nat_stmt->nat.addr));
- compound_expr_add(nat_expr, expr_get(nat_stmt->nat.proto));
+ concat_expr_add(nat_expr, expr_get(nat_stmt->nat.addr));
+ concat_expr_add(nat_expr, expr_get(nat_stmt->nat.proto));
} else {
nat_expr = expr_get(nat_stmt->nat.proto);
}
@@ -1110,7 +1110,7 @@ static void merge_concat_nat(const struct optimize_ctx *ctx,
for (j = 0; j < merge->num_stmts; j++) {
stmt = ctx->stmt_matrix[i][merge->stmt[j]];
expr = stmt->expr->right;
- compound_expr_add(concat, expr_get(expr));
+ concat_expr_add(concat, expr_get(expr));
}
nat_stmt = ctx->stmt_matrix[i][k];
@@ -1131,7 +1131,7 @@ static void merge_concat_nat(const struct optimize_ctx *ctx,
else if (left->payload.desc == &proto_ip6)
family = NFPROTO_IPV6;
}
- compound_expr_add(concat, expr_get(left));
+ concat_expr_add(concat, expr_get(left));
}
expr = map_expr_alloc(&internal_location, concat, set);
diff --git a/src/parser_bison.y b/src/parser_bison.y
index 75db4171..fd916f43 100644
--- a/src/parser_bison.y
+++ b/src/parser_bison.y
@@ -121,7 +121,7 @@ static struct expr *handle_concat_expr(const struct location *loc,
{
if (expr->etype != EXPR_CONCAT) {
expr = concat_expr_alloc(loc);
- compound_expr_add(expr, expr_l);
+ concat_expr_add(expr, expr_l);
} else {
location_update(&expr_r->location, loc_rhs, 2);
@@ -129,7 +129,7 @@ static struct expr *handle_concat_expr(const struct location *loc,
expr->location = *loc;
}
- compound_expr_add(expr, expr_r);
+ concat_expr_add(expr, expr_r);
return expr;
}
diff --git a/src/parser_json.c b/src/parser_json.c
index cd6744f9..6ed1841c 100644
--- a/src/parser_json.c
+++ b/src/parser_json.c
@@ -1347,10 +1347,10 @@ static struct expr *json_parse_concat_expr(struct json_ctx *ctx,
struct expr *concat;
concat = concat_expr_alloc(int_loc);
- compound_expr_add(concat, expr);
+ concat_expr_add(concat, expr);
expr = concat;
}
- compound_expr_add(expr, tmp);
+ concat_expr_add(expr, tmp);
}
return expr ? json_check_concat_expr(ctx, expr) : NULL;
}
@@ -1824,7 +1824,7 @@ static struct expr *json_parse_dtype_expr(struct json_ctx *ctx, json_t *root)
expr_free(expr);
return NULL;
}
- compound_expr_add(expr, i);
+ concat_expr_add(expr, i);
}
return json_check_concat_expr(ctx, expr);