diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-10-31 08:58:17 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-10-31 09:10:08 +0900 |
| commit | 022570ab8d3de0dd8e0acfb1d927a5e3547ea34e (patch) | |
| tree | 9236b0d5e25007e03926feecb85dffee7db3effa /src/vm.c | |
| parent | b6598e052fda9a27692156ab8b973ce6e3374ee3 (diff) | |
| download | mruby-022570ab8d3de0dd8e0acfb1d927a5e3547ea34e.tar.gz mruby-022570ab8d3de0dd8e0acfb1d927a5e3547ea34e.zip | |
Call stack may not reference the destination `proc`; fix #3838
The destination `proc` may be an orphan.
Diffstat (limited to 'src/vm.c')
| -rw-r--r-- | src/vm.c | 5 |
1 files changed, 3 insertions, 2 deletions
@@ -1916,6 +1916,7 @@ RETRY_TRY_BLOCK: case OP_R_RETURN: /* Fall through to OP_R_NORMAL otherwise */ if (ci->acc >=0 && MRB_PROC_ENV_P(proc) && !MRB_PROC_STRICT_P(proc)) { + mrb_callinfo *cibase = mrb->c->cibase; dst = top_proc(mrb, proc); if (MRB_PROC_ENV_P(dst)) { @@ -1926,14 +1927,14 @@ RETRY_TRY_BLOCK: goto L_RAISE; } } - while (ci->proc != dst) { + while (cibase <= ci && ci->proc != dst) { if (ci->acc < 0) { localjump_error(mrb, LOCALJUMP_ERROR_RETURN); goto L_RAISE; } ci--; } - if (ci == mrb->c->cibase) { + if (ci <= cibase) { localjump_error(mrb, LOCALJUMP_ERROR_RETURN); goto L_RAISE; } |
