Commit 452e90ba authored by Ondrej Zajicek (work)'s avatar Ondrej Zajicek (work)
Browse files

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.
parent 1127887a
Loading
Loading
Loading
Loading
+4 −25
Original line number Diff line number Diff line
@@ -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;
}