Replace compound_expr_add by concat_expr_add() to validate type.
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
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);
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);
}
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);
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);
}
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 {
"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);
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);
}
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);
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);
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);
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;
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 } */
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);
}
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];
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);
{
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);
expr->location = *loc;
}
- compound_expr_add(expr, expr_r);
+ concat_expr_add(expr, expr_r);
return expr;
}
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;
}
expr_free(expr);
return NULL;
}
- compound_expr_add(expr, i);
+ concat_expr_add(expr, i);
}
return json_check_concat_expr(ctx, expr);