summaryrefslogtreecommitdiffhomepage
path: root/src/vm.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-10-31 08:58:17 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-10-31 09:10:08 +0900
commit022570ab8d3de0dd8e0acfb1d927a5e3547ea34e (patch)
tree9236b0d5e25007e03926feecb85dffee7db3effa /src/vm.c
parentb6598e052fda9a27692156ab8b973ce6e3374ee3 (diff)
downloadmruby-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.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/vm.c b/src/vm.c
index a400190cc..bb884f4a0 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -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;
}