summaryrefslogtreecommitdiff
path: root/cont.c
diff options
context:
space:
mode:
authorBenoit Daloze <eregontp@gmail.com>2022-12-20 18:21:43 +0100
committerBenoit Daloze <eregontp@gmail.com>2022-12-20 19:32:23 +0100
commit0efa36ac06a14a3e2e0aca395fee6530c790bdf1 (patch)
treeea1b27a60f59fa7ce9e6f3efe5fd9934366c6f15 /cont.c
parentd557f17974384dde4ff2da021a1b38905a39bda2 (diff)
downloadruby-0efa36ac06a14a3e2e0aca395fee6530c790bdf1.tar.gz
Ensure Fiber storage is only accessed from the Fiber it belongs to
Diffstat (limited to 'cont.c')
-rw-r--r--cont.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/cont.c b/cont.c
index 521a91b2d9..89dcd49545 100644
--- a/cont.c
+++ b/cont.c
@@ -2069,6 +2069,14 @@ fiber_storage_get(rb_fiber_t *fiber)
return storage;
}
+static void storage_access_must_be_from_same_fiber(VALUE self) {
+ rb_fiber_t *fiber = fiber_ptr(self);
+ rb_fiber_t *current = fiber_current();
+ if (fiber != current) {
+ rb_raise(rb_eArgError, "Fiber storage can only be accessed from the Fiber it belongs to");
+ }
+}
+
/**
* call-seq: Fiber.current.storage -> hash (dup)
*
@@ -2077,6 +2085,7 @@ fiber_storage_get(rb_fiber_t *fiber)
static VALUE
rb_fiber_storage_get(VALUE self)
{
+ storage_access_must_be_from_same_fiber(self);
return rb_obj_dup(fiber_storage_get(fiber_ptr(self)));
}
@@ -2134,6 +2143,7 @@ rb_fiber_storage_set(VALUE self, VALUE value)
"Fiber#storage= is experimental and may be removed in the future!");
}
+ storage_access_must_be_from_same_fiber(self);
fiber_storage_validate(value);
fiber_ptr(self)->cont.saved_ec.storage = rb_obj_dup(value);