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.
This commit is contained in:
parent
61dae32b29
commit
9e2635505a
1 changed files with 5 additions and 6 deletions
|
@ -922,18 +922,17 @@
|
||||||
uint retpos = fstk->vcnt;
|
uint retpos = fstk->vcnt;
|
||||||
|
|
||||||
/* Drop every sub-block including ourselves */
|
/* 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. */
|
/* Now we are at the caller frame; if no such, try to convert to accept/reject. */
|
||||||
if (!fstk->ecnt)
|
if (!fstk->ecnt)
|
||||||
|
{
|
||||||
if (fstk->vstk[retpos].type == T_BOOL)
|
if (fstk->vstk[retpos].type == T_BOOL)
|
||||||
if (fstk->vstk[retpos].val.i)
|
return (fstk->vstk[retpos].val.i) ? F_ACCEPT : F_REJECT;
|
||||||
return F_ACCEPT;
|
|
||||||
else
|
|
||||||
return F_REJECT;
|
|
||||||
else
|
else
|
||||||
runtime("Can't return non-bool from non-function");
|
runtime("Can't return non-bool from non-function");
|
||||||
|
}
|
||||||
|
|
||||||
/* Set the value stack position, overwriting the former implicit void */
|
/* Set the value stack position, overwriting the former implicit void */
|
||||||
fstk->vcnt = fstk->estk[fstk->ecnt].ventry - 1;
|
fstk->vcnt = fstk->estk[fstk->ecnt].ventry - 1;
|
||||||
|
|
Loading…
Reference in a new issue