summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Evans <code@jeremyevans.net>2022-01-04 09:13:19 -0800
committerJeremy Evans <code@jeremyevans.net>2022-01-04 10:03:18 -0800
commit9e0a91d0640600f2dfd7fc1d5fae6667019c9ca5 (patch)
treefb855c6b00e7bcf60f2f4d28342ad776c2fcbc01
parente7806049c06f8e5a122d48b5454796c6ae6acac1 (diff)
Don't segfault if Warning.warn is undefined
Check that there is a method entry for the method before passing it to rb_method_entry_arity. Fixes [Bug #18458]
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/5391
-rw-r--r--error.c3
-rw-r--r--test/ruby/test_exception.rb8
2 files changed, 10 insertions, 1 deletions
diff --git a/error.c b/error.c
index 6a60919d5c..c7c5159927 100644
--- a/error.c
+++ b/error.c
@@ -317,7 +317,8 @@ rb_warning_warn(VALUE mod, VALUE str)
static int
rb_warning_warn_arity(void)
{
- return rb_method_entry_arity(rb_method_entry(rb_singleton_class(rb_mWarning), id_warn));
+ const rb_method_entry_t *me = rb_method_entry(rb_singleton_class(rb_mWarning), id_warn);
+ return me ? rb_method_entry_arity(me) : 1;
}
static VALUE
diff --git a/test/ruby/test_exception.rb b/test/ruby/test_exception.rb
index 2985f75fd6..3be9b9aee0 100644
--- a/test/ruby/test_exception.rb
+++ b/test/ruby/test_exception.rb
@@ -1192,6 +1192,14 @@ $stderr = $stdout; raise "\x82\xa0"') do |outs, errs, status|
assert_empty warning
end
+ def test_undef_Warning_warn
+ assert_separately([], "#{<<-"begin;"}\n#{<<-"end;"}")
+ begin;
+ Warning.undef_method(:warn)
+ assert_raise(NoMethodError) { warn "" }
+ end;
+ end
+
def test_undefined_backtrace
assert_separately([], "#{<<-"begin;"}\n#{<<-"end;"}")
begin;