diff options
author | nagachika <nagachika@ruby-lang.org> | 2021-11-23 14:19:44 +0900 |
---|---|---|
committer | nagachika <nagachika@ruby-lang.org> | 2021-11-23 14:52:29 +0900 |
commit | b6f87d527f59257f07ba6774addaefdedee4fcde (patch) | |
tree | 4190f6599a6f560f4a8c9ff0a4e49fd2a7a5ba95 /vm_insnhelper.c | |
parent | 32342c9fcaaf64f5d6b86ea4e041c9331fb381d3 (diff) |
merge revision(s) 84202963c52e02cecad3e6b2fad478bfbeee1bc7: [Backport #18329]
[Bug #18329] Fix crash when calling non-existent super method
The cme is NULL when a method does not exist, so check it before
accessing the callcache.
---
test/ruby/test_super.rb | 31 +++++++++++++++++++++++++++++++
vm_insnhelper.c | 3 ++-
2 files changed, 33 insertions(+), 1 deletion(-)
Diffstat (limited to 'vm_insnhelper.c')
-rw-r--r-- | vm_insnhelper.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/vm_insnhelper.c b/vm_insnhelper.c index fc2c7f8fca..757e75d66f 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -1806,7 +1806,8 @@ vm_search_method_fastpath(VALUE cd_owner, struct rb_call_data *cd, VALUE klass) #if OPT_INLINE_METHOD_CACHE if (LIKELY(vm_cc_class_check(cc, klass))) { - if (LIKELY(!METHOD_ENTRY_INVALIDATED(vm_cc_cme(cc)))) { + const struct rb_callable_method_entry_struct *cme = vm_cc_cme(cc); + if (LIKELY(cme && !METHOD_ENTRY_INVALIDATED(cme))) { VM_ASSERT(callable_method_entry_p(vm_cc_cme(cc))); RB_DEBUG_COUNTER_INC(mc_inline_hit); VM_ASSERT(vm_cc_cme(cc) == NULL || // not found |