From e8c7a780d2755f5cccd7369f32f771bab2fcaf63 Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Wed, 13 Aug 2025 15:15:08 +0200 Subject: [PATCH] src: replace compound_expr_add() by type safe list_expr_add() Replace compound_expr_add() by list_expr_add() to validate type. Signed-off-by: Pablo Neira Ayuso --- include/expression.h | 1 + src/expression.c | 8 ++++++++ src/netlink_delinearize.c | 2 +- src/parser_bison.y | 20 ++++++++++---------- src/parser_json.c | 6 +++--- src/trace.c | 10 +++++----- 6 files changed, 28 insertions(+), 19 deletions(-) diff --git a/include/expression.h b/include/expression.h index 0d9e10d7..ad469db2 100644 --- a/include/expression.h +++ b/include/expression.h @@ -534,6 +534,7 @@ 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); +void list_expr_add(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, diff --git a/src/expression.c b/src/expression.c index 95cdedaa..9521e67c 100644 --- a/src/expression.c +++ b/src/expression.c @@ -1272,6 +1272,14 @@ struct expr *list_expr_alloc(const struct location *loc) return compound_expr_alloc(loc, EXPR_LIST); } +void list_expr_add(struct expr *expr, struct expr *item) +{ + struct expr_list *expr_list = expr_list(expr); + + list_add_tail(&item->list, &expr_list->expressions); + expr_list->size++; +} + /* list is assumed to have two items at least, otherwise extend this! */ struct expr *list_expr_to_binop(struct expr *expr) { diff --git a/src/netlink_delinearize.c b/src/netlink_delinearize.c index ccccb67a..990edc82 100644 --- a/src/netlink_delinearize.c +++ b/src/netlink_delinearize.c @@ -2454,7 +2454,7 @@ static struct expr *binop_tree_to_list(struct expr *list, struct expr *expr) } else { if (list == NULL) return expr_get(expr); - compound_expr_add(list, expr_get(expr)); + list_expr_add(list, expr_get(expr)); } return list; diff --git a/src/parser_bison.y b/src/parser_bison.y index fd916f43..bdcce4c1 100644 --- a/src/parser_bison.y +++ b/src/parser_bison.y @@ -2503,11 +2503,11 @@ flowtable_expr : '{' flowtable_list_expr '}' flowtable_list_expr : flowtable_expr_member { $$ = compound_expr_alloc(&@$, EXPR_LIST); - compound_expr_add($$, $1); + list_expr_add($$, $1); } | flowtable_list_expr COMMA flowtable_expr_member { - compound_expr_add($1, $3); + list_expr_add($1, $3); $$ = $1; } | flowtable_list_expr COMMA opt_newline @@ -2842,14 +2842,14 @@ dev_spec : DEVICE string YYERROR; $$ = compound_expr_alloc(&@$, EXPR_LIST); - compound_expr_add($$, expr); + list_expr_add($$, expr); } | DEVICE variable_expr { datatype_set($2->sym->expr, &ifname_type); $$ = compound_expr_alloc(&@$, EXPR_LIST); - compound_expr_add($$, $2); + list_expr_add($$, $2); } | DEVICES '=' flowtable_expr { @@ -5199,13 +5199,13 @@ relational_expr : expr /* implicit */ rhs_expr list_rhs_expr : basic_rhs_expr COMMA basic_rhs_expr { $$ = list_expr_alloc(&@$); - compound_expr_add($$, $1); - compound_expr_add($$, $3); + list_expr_add($$, $1); + list_expr_add($$, $3); } | list_rhs_expr COMMA basic_rhs_expr { $1->location = @$; - compound_expr_add($1, $3); + list_expr_add($1, $3); $$ = $1; } ; @@ -5763,13 +5763,13 @@ symbol_stmt_expr : symbol_expr list_stmt_expr : symbol_stmt_expr COMMA symbol_stmt_expr { $$ = list_expr_alloc(&@$); - compound_expr_add($$, $1); - compound_expr_add($$, $3); + list_expr_add($$, $1); + list_expr_add($$, $3); } | list_stmt_expr COMMA symbol_stmt_expr { $1->location = @$; - compound_expr_add($1, $3); + list_expr_add($1, $3); $$ = $1; } ; diff --git a/src/parser_json.c b/src/parser_json.c index 6ed1841c..c107dfc8 100644 --- a/src/parser_json.c +++ b/src/parser_json.c @@ -1704,7 +1704,7 @@ static struct expr *json_parse_expr(struct json_ctx *ctx, json_t *root) expr_free(list); return NULL; } - compound_expr_add(list, expr); + list_expr_add(list, expr); } return list; case JSON_TRUE: @@ -3038,7 +3038,7 @@ static struct expr *json_parse_devs(struct json_ctx *ctx, json_t *root) return NULL; } - compound_expr_add(expr, tmp); + list_expr_add(expr, tmp); return expr; } if (!json_is_array(root)) { @@ -3059,7 +3059,7 @@ static struct expr *json_parse_devs(struct json_ctx *ctx, json_t *root) expr_free(expr); return NULL; } - compound_expr_add(expr, tmp); + list_expr_add(expr, tmp); } return expr; } diff --git a/src/trace.c b/src/trace.c index 47f4c215..051cc12d 100644 --- a/src/trace.c +++ b/src/trace.c @@ -268,11 +268,11 @@ static struct expr *trace_alloc_list(const struct datatype *dtype, if (bitv == 0) continue; - compound_expr_add(list_expr, - constant_expr_alloc(&netlink_location, - dtype, byteorder, - len * BITS_PER_BYTE, - &bitv)); + list_expr_add(list_expr, + constant_expr_alloc(&netlink_location, + dtype, byteorder, + len * BITS_PER_BYTE, + &bitv)); } mpz_clear(value); -- 2.47.3