diff options
author | Ondrej Zajicek (work) <santiago@crfreenet.org> | 2020-12-28 15:23:28 +0100 |
---|---|---|
committer | Ondrej Zajicek (work) <santiago@crfreenet.org> | 2020-12-28 15:23:28 +0100 |
commit | 9e2635505a08e3453eef487360e49b4b70987ceb (patch) | |
tree | 58529825617ae34a66f10f2474e66f294b005b03 /filter | |
parent | 61dae32b29cc57b9884a1c13e5d630096e157a38 (diff) |
Filter: Fix return on top-level
Broken detection of top-level case caused crash when return was called
from top-of-stack position. It should behave as reject/accept.
Thanks to Damian Zaremba for the bugreport.
Diffstat (limited to 'filter')
-rw-r--r-- | filter/f-inst.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/filter/f-inst.c b/filter/f-inst.c index 58717d55..b6bc81f7 100644 --- a/filter/f-inst.c +++ b/filter/f-inst.c @@ -922,18 +922,17 @@ uint retpos = fstk->vcnt; /* Drop every sub-block including ourselves */ - while ((fstk->ecnt-- > 0) && !(fstk->estk[fstk->ecnt].emask & FE_RETURN)) - ; + do fstk->ecnt--; + while ((fstk->ecnt > 0) && !(fstk->estk[fstk->ecnt].emask & FE_RETURN)); /* Now we are at the caller frame; if no such, try to convert to accept/reject. */ if (!fstk->ecnt) + { if (fstk->vstk[retpos].type == T_BOOL) - if (fstk->vstk[retpos].val.i) - return F_ACCEPT; - else - return F_REJECT; + return (fstk->vstk[retpos].val.i) ? F_ACCEPT : F_REJECT; else runtime("Can't return non-bool from non-function"); + } /* Set the value stack position, overwriting the former implicit void */ fstk->vcnt = fstk->estk[fstk->ecnt].ventry - 1; |