aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsamuel <samuel@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-12-28 13:03:14 +0000
committersamuel <samuel@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-12-28 13:03:14 +0000
commit9ee79b658123a2a4af65c80484d1f91ce73354e2 (patch)
treea562204102848b8c6ede78ff9bd90876a8af4e21
parent5fb9d1e11fc50df359a1f9d2537a11f13cdb6d33 (diff)
downloadruby-9ee79b658123a2a4af65c80484d1f91ce73354e2.tar.gz
Don't allow rb_fiber_resume to raise exception on unborn fiber.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66611 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--cont.c5
-rw-r--r--test/ruby/test_fiber.rb1
2 files changed, 6 insertions, 0 deletions
diff --git a/cont.c b/cont.c
index dcf6b01db8..45277ebf18 100644
--- a/cont.c
+++ b/cont.c
@@ -1896,9 +1896,14 @@ rb_fiber_resume(VALUE fibval, int argc, const VALUE *argv)
{
rb_fiber_t *fib = fiber_ptr(fibval);
+ if (argc == -1 && FIBER_CREATED_P(fib)) {
+ rb_raise(rb_eFiberError, "cannot raise exception on unborn fiber");
+ }
+
if (fib->prev != 0 || fiber_is_root_p(fib)) {
rb_raise(rb_eFiberError, "double resume");
}
+
if (fib->transferred != 0) {
rb_raise(rb_eFiberError, "cannot resume transferred Fiber");
}
diff --git a/test/ruby/test_fiber.rb b/test/ruby/test_fiber.rb
index db2627d9a1..ec6bd0201c 100644
--- a/test/ruby/test_fiber.rb
+++ b/test/ruby/test_fiber.rb
@@ -144,6 +144,7 @@ class TestFiber < Test::Unit::TestCase
}
assert_raise(RuntimeError){
fib = Fiber.new{ Fiber.yield }
+ fib.resume
fib.raise "raise and propagate"
}
assert_nothing_raised{