summaryrefslogtreecommitdiffhomepage
path: root/mrbgems
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2018-06-14 11:13:50 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2018-06-14 11:15:49 +0900
commita7f77fefa9842f6a46734caea800250f0be8588c (patch)
treeb136aa850109e2cce18539559331324d06986ce8 /mrbgems
parent896de5532b6283e81e4e492edfcf5e91c1d232b1 (diff)
downloadmruby-a7f77fefa9842f6a46734caea800250f0be8588c.tar.gz
mruby-a7f77fefa9842f6a46734caea800250f0be8588c.zip
Check for switching to uninitialized fiber; fix #4041
The problem was caused by `Fiber.current.resume'.
Diffstat (limited to 'mrbgems')
-rw-r--r--mrbgems/mruby-fiber/src/fiber.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/mrbgems/mruby-fiber/src/fiber.c b/mrbgems/mruby-fiber/src/fiber.c
index bff8726a7..27b74dba5 100644
--- a/mrbgems/mruby-fiber/src/fiber.c
+++ b/mrbgems/mruby-fiber/src/fiber.c
@@ -196,7 +196,7 @@ fiber_switch(mrb_state *mrb, mrb_value self, mrb_int len, const mrb_value *a, mr
mrb_raise(mrb, E_FIBER_ERROR, "resuming transferred fiber");
}
if (status == MRB_FIBER_RUNNING || status == MRB_FIBER_RESUMED) {
- mrb_raise(mrb, E_FIBER_ERROR, "double resume (fib)");
+ mrb_raise(mrb, E_FIBER_ERROR, "double resume");
}
if (status == MRB_FIBER_TERMINATED) {
mrb_raise(mrb, E_FIBER_ERROR, "resuming dead fiber");
@@ -207,6 +207,9 @@ fiber_switch(mrb_state *mrb, mrb_value self, mrb_int len, const mrb_value *a, mr
if (status == MRB_FIBER_CREATED) {
mrb_value *b, *e;
+ if (!c->ci->proc) {
+ mrb_raise(mrb, E_FIBER_ERROR, "double resume (current)");
+ }
mrb_stack_extend(mrb, len+2); /* for receiver and (optional) block */
b = c->stack+1;
e = b + len;