diff options
author | Jeremy Evans <code@jeremyevans.net> | 2022-02-17 10:24:01 -0800 |
---|---|---|
committer | Jeremy Evans <code@jeremyevans.net> | 2022-03-24 12:31:07 -0700 |
commit | 343ea9967e4a6b279eed6bd8e81ad0bdc747f254 (patch) | |
tree | 96c0a77db135ec1fdd374144e0e00238e2dfc1c3 /vm.c | |
parent | 33b13bd9f19ac806c34d428af49a71c1aa286f7e (diff) |
Raise RuntimeError if Kernel#binding is called from a non-Ruby frame
Check whether the current or previous frame is a Ruby frame in
call_trace_func before attempting to create a binding for the frame.
Fixes [Bug #18487]
Co-authored-by: Alan Wu <XrXr@users.noreply.github.com>
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/5567
Diffstat (limited to 'vm.c')
-rw-r--r-- | vm.c | 11 |
1 files changed, 4 insertions, 7 deletions
@@ -1254,15 +1254,12 @@ rb_vm_make_binding(const rb_execution_context_t *ec, const rb_control_frame_t *s if (cfp == 0 || ruby_level_cfp == 0) { rb_raise(rb_eRuntimeError, "Can't create Binding Object on top of Fiber."); } - - while (1) { - envval = vm_make_env_object(ec, cfp); - if (cfp == ruby_level_cfp) { - break; - } - cfp = rb_vm_get_binding_creatable_next_cfp(ec, RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp)); + if (!VM_FRAME_RUBYFRAME_P(src_cfp) && + !VM_FRAME_RUBYFRAME_P(RUBY_VM_PREVIOUS_CONTROL_FRAME(src_cfp))) { + rb_raise(rb_eRuntimeError, "Cannot create Binding object for non-Ruby caller"); } + envval = vm_make_env_object(ec, cfp); bindval = rb_binding_alloc(rb_cBinding); GetBindingPtr(bindval, bind); vm_bind_update_env(bindval, bind, envval); |