]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
src: replace compound_expr_add() by type safe concat_expr_add()
authorPablo Neira Ayuso <pablo@netfilter.org>
Wed, 13 Aug 2025 13:14:48 +0000 (15:14 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Wed, 27 Aug 2025 21:52:08 +0000 (23:52 +0200)
Replace compound_expr_add by concat_expr_add() to validate type.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/expression.h
src/expression.c
src/netlink.c
src/netlink_delinearize.c
src/optimize.c
src/parser_bison.y
src/parser_json.c

index 4dc6c1926f95c32a7b99d3b4235169baa75316c7..0d9e10d7717e4c1934cf096e1170fa2a054444ca 100644 (file)
@@ -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);
index 8c5b5176fe8b1a6ce9d309366d9c527a5fd2a69d..95cdedaa3bd685f2405b1d558f04d4c4904ed8f9 100644 (file)
@@ -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);
index 0fa8d1f3ff686122b7a68e3e2ea99aa281447966..5876c08929f7ac5cb4aa08872eef7d985a1c6081 100644 (file)
@@ -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 {
index 5627826dfad06edd33be6422f0968fa5b96b034b..ccccb67aa8fa541cc172d71babea0b796e49a898 100644 (file)
@@ -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);
index b2fd9e829f006811e451adbd5d6f74226f9624c1..cdd6913a306dd8ecc4b104e99fa5d819737628f8 100644 (file)
@@ -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);
 
index 75db4171b2e2572c0156a865243734207e35885a..fd916f43404b33840a89bd34c929d75099261d51 100644 (file)
@@ -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;
 }
 
index cd6744f96268e1731eda79ff5e3f19bff1056a1a..6ed1841c4e9c4579baf1a7b66d50abf7485c8d63 100644 (file)
@@ -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);