mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-11-17 16:48:43 +00:00
Filter: Fix crash with 'where' filters and function calls
The old 'where' code computed size value incorrectly, which leads to invalid instruction lines and filter errors or crashes.
This commit is contained in:
parent
1127887a8b
commit
452e90ba72
@ -32,33 +32,12 @@ filter_name(const struct filter *filter)
|
|||||||
|
|
||||||
struct filter *f_new_where(struct f_inst *where)
|
struct filter *f_new_where(struct f_inst *where)
|
||||||
{
|
{
|
||||||
struct f_inst acc = {
|
struct f_inst *cond = f_new_inst(FI_CONDITION, where,
|
||||||
.fi_code = FI_DIE,
|
f_new_inst(FI_DIE, F_ACCEPT),
|
||||||
.lineno = ifs->lino,
|
f_new_inst(FI_DIE, F_REJECT));
|
||||||
.size = 1,
|
|
||||||
.i_FI_DIE = { .fret = F_ACCEPT, },
|
|
||||||
};
|
|
||||||
|
|
||||||
struct f_inst rej = {
|
|
||||||
.fi_code = FI_DIE,
|
|
||||||
.lineno = ifs->lino,
|
|
||||||
.size = 1,
|
|
||||||
.i_FI_DIE = { .fret = F_REJECT, },
|
|
||||||
};
|
|
||||||
|
|
||||||
struct f_inst i = {
|
|
||||||
.fi_code = FI_CONDITION,
|
|
||||||
.lineno = ifs->lino,
|
|
||||||
.size = 3 + where->size,
|
|
||||||
.i_FI_CONDITION = {
|
|
||||||
.f1 = where,
|
|
||||||
.f2 = &acc,
|
|
||||||
.f3 = &rej,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
struct filter *f = cfg_allocz(sizeof(struct filter));
|
struct filter *f = cfg_allocz(sizeof(struct filter));
|
||||||
f->root = f_linearize(&i);
|
f->root = f_linearize(cond);
|
||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user