Replace compound_expr_add() by set_expr_add() to validate type.
Add __set_expr_add() to skip size updates in src/intervals.c
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
extern struct expr *set_expr_alloc(const struct location *loc,
const struct set *set);
+void __set_expr_add(struct expr *set, struct expr *elem);
+void set_expr_add(struct expr *set, struct expr *elem);
+
extern void concat_range_aggregate(struct expr *set);
extern void interval_map_decompose(struct expr *set);
return set_expr;
}
+void __set_expr_add(struct expr *set, struct expr *elem)
+{
+ list_add_tail(&elem->list, &expr_set(set)->expressions);
+}
+
+void set_expr_add(struct expr *set, struct expr *elem)
+{
+ struct expr_set *expr_set = expr_set(set);
+
+ list_add_tail(&elem->list, &expr_set->expressions);
+ expr_set->size++;
+}
+
static void mapping_expr_print(const struct expr *expr, struct output_ctx *octx)
{
expr_print(expr->left, octx);
}
clone = expr_clone(i);
clone->flags |= EXPR_F_KERNEL;
- list_add_tail(&clone->list, &expr_set(existing_set->init)->expressions);
+ __set_expr_add(existing_set->init, clone);
}
}
clone = expr_clone(prev);
mpz_set(clone->key->range.low, i->key->range.high);
mpz_add_ui(clone->key->range.low, i->key->range.high, 1);
- list_add_tail(&clone->list, &expr_set(set->existing_set->init)->expressions);
+ __set_expr_add(set->existing_set->init, clone);
mpz_set(prev->key->range.high, i->key->range.low);
mpz_sub_ui(prev->key->range.high, i->key->range.low, 1);
list_for_each_entry(i, &expr_set(existing_set->init)->expressions, list) {
if (!(i->flags & EXPR_F_KERNEL)) {
clone = expr_clone(i);
- list_add_tail(&clone->list, &expr_set(add)->expressions);
+ __set_expr_add(add, clone);
i->flags |= EXPR_F_KERNEL;
}
}
else if (existing_set) {
clone = expr_clone(i);
clone->flags |= EXPR_F_KERNEL;
- list_add_tail(&clone->list, &expr_set(existing_set->init)->expressions);
+ __set_expr_add(existing_set->init, clone);
}
}
/* if cache exists, dummyset must contain the other end of the range */
if (cached_set->rg_cache) {
- compound_expr_add(dummyset->init, cached_set->rg_cache);
+ set_expr_add(dummyset->init, cached_set->rg_cache);
cached_set->rg_cache = NULL;
goto out_decompose;
}
expr = mapping_expr_alloc(&netlink_location, expr, data);
}
out:
- compound_expr_add(set->init, expr);
+ set_expr_add(set->init, expr);
if (!(flags & NFT_SET_ELEM_INTERVAL_END) &&
nftnl_set_elem_is_set(nlse, NFTNL_SET_ELEM_KEY_END)) {
expr_a = stmt_a->expr->right;
elem = set_elem_expr_alloc(&internal_location, expr_get(expr_a));
- compound_expr_add(set, elem);
+ set_expr_add(set, elem);
for (i = from + 1; i <= to; i++) {
stmt_b = ctx->stmt_matrix[i][merge->stmt[0]];
expr_b = stmt_b->expr->right;
elem = set_elem_expr_alloc(&internal_location, expr_get(expr_b));
- compound_expr_add(set, elem);
+ set_expr_add(set, elem);
}
expr_free(stmt_a->expr->right);
mappings = stmt_b->expr->mappings;
list_for_each_entry(expr, &expr_set(mappings)->expressions, list) {
mapping = expr_clone(expr);
- compound_expr_add(stmt_a->expr->mappings, mapping);
+ set_expr_add(stmt_a->expr->mappings, mapping);
}
}
list_for_each_entry_safe(concat, next, &concat_list, list) {
list_del(&concat->list);
elem = set_elem_expr_alloc(&internal_location, concat);
- compound_expr_add(set, elem);
+ set_expr_add(set, elem);
}
}
mapping = mapping_expr_alloc(&internal_location, elem,
expr_get(verdict->expr));
- compound_expr_add(set, mapping);
+ set_expr_add(set, mapping);
}
stmt_free(counter);
break;
mapping = mapping_expr_alloc(&internal_location, elem,
expr_get(verdict->expr));
- compound_expr_add(set, mapping);
+ set_expr_add(set, mapping);
}
stmt_free(counter);
break;
mapping = mapping_expr_alloc(&internal_location, elem,
expr_get(verdict->expr));
- compound_expr_add(set, mapping);
+ set_expr_add(set, mapping);
break;
default:
assert(0);
mapping = mapping_expr_alloc(&internal_location, elem,
expr_get(verdict->expr));
- compound_expr_add(set, mapping);
+ set_expr_add(set, mapping);
}
stmt_free(counter);
}
elem = set_elem_expr_alloc(&internal_location, expr_get(expr));
mapping = mapping_expr_alloc(&internal_location, elem, nat_expr);
- compound_expr_add(set, mapping);
+ set_expr_add(set, mapping);
}
stmt = ctx->stmt_matrix[from][merge->stmt[0]];
elem = set_elem_expr_alloc(&internal_location, concat);
mapping = mapping_expr_alloc(&internal_location, elem, nat_expr);
- compound_expr_add(set, mapping);
+ set_expr_add(set, mapping);
}
concat = concat_expr_alloc(&internal_location);
verdict_map_list_expr : verdict_map_list_member_expr
{
$$ = set_expr_alloc(&@$, NULL);
- compound_expr_add($$, $1);
+ set_expr_add($$, $1);
}
| verdict_map_list_expr COMMA verdict_map_list_member_expr
{
- compound_expr_add($1, $3);
+ set_expr_add($1, $3);
$$ = $1;
}
| verdict_map_list_expr COMMA opt_newline
set_list_expr : set_list_member_expr
{
$$ = set_expr_alloc(&@$, NULL);
- compound_expr_add($$, $1);
+ set_expr_add($$, $1);
}
| set_list_expr COMMA set_list_member_expr
{
- compound_expr_add($1, $3);
+ set_expr_add($1, $3);
$$ = $1;
}
| set_list_expr COMMA opt_newline
expr = set_elem_expr_alloc(int_loc, expr);
set_expr = set_expr_alloc(int_loc, NULL);
- compound_expr_add(set_expr, expr);
+ set_expr_add(set_expr, expr);
return set_expr;
}
if (!set_expr)
set_expr = set_expr_alloc(int_loc, NULL);
- compound_expr_add(set_expr, expr);
+ set_expr_add(set_expr, expr);
}
return set_expr;
}
BYTEORDER_BIG_ENDIAN, BITS_PER_BYTE,
constant_data_ptr(echo, BITS_PER_BYTE));
right = set_elem_expr_alloc(&expr->location, right);
- compound_expr_add(set, right);
+ set_expr_add(set, right);
right = constant_expr_alloc(&expr->location, icmp_type,
BYTEORDER_BIG_ENDIAN, BITS_PER_BYTE,
constant_data_ptr(reply, BITS_PER_BYTE));
right = set_elem_expr_alloc(&expr->location, right);
- compound_expr_add(set, right);
+ set_expr_add(set, right);
dep = relational_expr_alloc(&expr->location, OP_IMPLICIT, left, set);
return expr_stmt_alloc(&dep->location, dep);
constant_data_ptr(icmp_addr_types[i],
BITS_PER_BYTE));
right = set_elem_expr_alloc(&expr->location, right);
- compound_expr_add(set, right);
+ set_expr_add(set, right);
}
dep = relational_expr_alloc(&expr->location, OP_IMPLICIT, left, set);
expr = set_elem_expr_alloc(&internal_location, expr);
expr->flags = flags;
- compound_expr_add(init, expr);
+ set_expr_add(init, expr);
}
struct expr *get_set_intervals(const struct set *set, const struct expr *init)
i->flags, byteorder);
break;
case EXPR_CONCAT:
- compound_expr_add(new_init, expr_clone(i));
+ set_expr_add(new_init, expr_clone(i));
i->flags |= EXPR_F_INTERVAL_END;
- compound_expr_add(new_init, expr_clone(i));
+ set_expr_add(new_init, expr_clone(i));
break;
case EXPR_SET_ELEM_CATCHALL:
- compound_expr_add(new_init, expr_clone(i));
+ set_expr_add(new_init, expr_clone(i));
break;
default:
range_expr_value_low(low, i);
switch (expr->etype) {
case EXPR_SET_ELEM:
list_splice_init(&orig->stmt_list, &expr->stmt_list);
- compound_expr_add(compound, expr);
+ set_expr_add(compound, expr);
break;
case EXPR_MAPPING:
list_splice_init(&orig->left->stmt_list, &expr->left->stmt_list);
- compound_expr_add(compound, expr);
+ set_expr_add(compound, expr);
break;
default:
elem = set_elem_expr_alloc(&orig->location, expr);
list_splice_init(&orig->stmt_list, &elem->stmt_list);
- compound_expr_add(compound, elem);
+ set_expr_add(compound, elem);
break;
}
}
} else
expr = interval_to_range(low, i, range);
- compound_expr_add(set, expr);
+ set_expr_add(set, expr);
mpz_clear(range);
mpz_clear(p);
mpz_bitmask(i->value, i->len);
if (!mpz_cmp(i->value, expr_value(low)->value)) {
- compound_expr_add(set, low);
+ set_expr_add(set, low);
} else {
add_interval(set, low, i);
expr_free(low);
out:
if (catchall) {
catchall->flags |= EXPR_F_KERNEL;
- compound_expr_add(set, catchall);
+ set_expr_add(set, catchall);
}
free(ranges);