diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-09-21 06:41:07 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-09-21 06:41:07 +0000 |
commit | ac4b2d990c8484af7a214381e61d3494b6b858b1 () | |
tree | 772448ed64eb627f8c03f37f4a5eaca95a29aecd /vm_backtrace.c | |
parent | a810a1a78c6ed91debffc37d9f8e6bea07decbcf (diff) |
escape all env properly.
* vm_backtrace.c (rb_debug_inspector_open): escape all env using `rb_vm_stack_to_heap()` before making bindings. [Bug #15105] There is a complicated story of this issue: Without this , IFUNC frame does not escaped. A IFUNC frame points to CFUNC ep as previous ep. However, CFUNC ep can be escaped because of making bindings of Ruby level frames. IFUNC's ep can points to invalidated ep and `rb_iter_break()` will fail. This is why `any?` fails. * test/-ext-/debug/test_debug.rb: add a test. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64800 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | vm_backtrace.c | 3 |
1 files changed, 3 insertions, 0 deletions
@@ -1202,6 +1202,9 @@ rb_debug_inspector_open(rb_debug_inspector_func_t func, void *data) enum ruby_tag_type state; volatile VALUE MAYBE_UNUSED(result); dbg_context.ec = ec; dbg_context.cfp = dbg_context.ec->cfp; dbg_context.backtrace = ec_backtrace_location_ary(ec, 0, 0); |