From: Ondrej Zajicek (work) Date: Tue, 10 Sep 2019 11:45:18 +0000 (+0200) Subject: Filter: Fix crash with 'where' filters and function calls X-Git-Tag: v2.0.6~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=452e90ba72f57c44b44f9940ac951d2fde417583;p=thirdparty%2Fbird.git 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. --- diff --git a/filter/f-util.c b/filter/f-util.c index e61949f24..410999a64 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; }