aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOndrej Zajicek (work) <santiago@crfreenet.org>2019-09-10 13:45:18 +0200
committerOndrej Zajicek (work) <santiago@crfreenet.org>2019-09-10 13:45:18 +0200
commit452e90ba72f57c44b44f9940ac951d2fde417583 (patch)
tree0ee72b911906ea1830bd353c400785098b0c6b41
parent1127887a8b111dab18c592f1f3f575920f38bfe3 (diff)
downloadbird-452e90ba72f57c44b44f9940ac951d2fde417583.tar.gz
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.
-rw-r--r--filter/f-util.c29
1 files changed, 4 insertions, 25 deletions
diff --git a/filter/f-util.c b/filter/f-util.c
index e61949f2..410999a6 100644
--- a/filter/f-util.c
+++ b/filter/f-util.c
@@ -32,33 +32,12 @@ filter_name(const struct filter *filter)
struct filter *f_new_where(struct f_inst *where)
{
- struct f_inst acc = {
- .fi_code = FI_DIE,
- .lineno = ifs->lino,
- .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 f_inst *cond = f_new_inst(FI_CONDITION, where,
+ f_new_inst(FI_DIE, F_ACCEPT),
+ f_new_inst(FI_DIE, F_REJECT));
struct filter *f = cfg_allocz(sizeof(struct filter));
- f->root = f_linearize(&i);
+ f->root = f_linearize(cond);
return f;
}