diff options
author | nagachika <nagachika@ruby-lang.org> | 2023-03-21 12:00:17 +0900 |
---|---|---|
committer | nagachika <nagachika@ruby-lang.org> | 2023-03-21 12:00:17 +0900 |
commit | eba3f787cbd38acf60fff6bdb450aacfc2e9c3a1 (patch) | |
tree | 823ff47ff9e0e5671f98e1cb36add1181e7a4094 /vm_trace.c | |
parent | 3efc43aace4e051f618b10e82bd82e93076dc757 (diff) |
merge revision(s) 837ef8911c638c3e2bdb6af710de7c1fac7b5f90: [Backport #19305]
Fix crash in TracePoint c_call for removed method
trace_arg->id is the ID of the original method of an aliased method. If
the original method is removed, then the lookup will fail. We should use
trace_arg->called_id instead, which is the ID of the aliased method.
Fixes [Bug #19305]
---
test/ruby/test_settracefunc.rb | 23 +++++++++++++++++++++++
vm_trace.c | 2 +-
2 files changed, 24 insertions(+), 1 deletion(-)
Diffstat (limited to 'vm_trace.c')
-rw-r--r-- | vm_trace.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/vm_trace.c b/vm_trace.c index 466856341d..a9127b7811 100644 --- a/vm_trace.c +++ b/vm_trace.c @@ -903,14 +903,14 @@ rb_tracearg_parameters(rb_trace_arg_t *trace_arg) } case RUBY_EVENT_C_CALL: case RUBY_EVENT_C_RETURN: { - fill_id_and_klass(trace_arg); - if (trace_arg->klass && trace_arg->id) { - const rb_method_entry_t *me; - VALUE iclass = Qnil; - me = rb_method_entry_without_refinements(trace_arg->klass, trace_arg->id, &iclass); - return rb_unnamed_parameters(rb_method_entry_arity(me)); - } - break; + fill_id_and_klass(trace_arg); + if (trace_arg->klass && trace_arg->id) { + const rb_method_entry_t *me; + VALUE iclass = Qnil; + me = rb_method_entry_without_refinements(trace_arg->klass, trace_arg->called_id, &iclass); + return rb_unnamed_parameters(rb_method_entry_arity(me)); + } + break; } case RUBY_EVENT_RAISE: case RUBY_EVENT_LINE: |