From 8a2a882e53ade974494dbf7c968a85bad0393dcd Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 13 Oct 2017 01:34:52 +0000 Subject: [PATCH] error.c: infinite recursion at Warning#warn * error.c (rb_warn_m): write the message to rb_stderr directly, to get rid of infinite recursion when called on Warning module itself, by super in redefined Warning#warn. [ruby-dev:50293] [Bug #14006] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60175 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- error.c | 8 +++++++- test/ruby/test_exception.rb | 14 ++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/error.c b/error.c index ffdd1a4ef1..7f9e582930 100644 --- a/error.c +++ b/error.c @@ -329,7 +329,13 @@ rb_warn_m(int argc, VALUE *argv, VALUE exc) rb_io_puts(argc, argv, str); RBASIC_SET_CLASS(str, rb_cString); } - rb_write_warning_str(str); + if (exc == rb_mWarning) { + rb_must_asciicompat(str); + rb_write_error_str(str); + } + else { + rb_write_warning_str(str); + } } return Qnil; } diff --git a/test/ruby/test_exception.rb b/test/ruby/test_exception.rb index bcad728789..3622cae0d9 100644 --- a/test/ruby/test_exception.rb +++ b/test/ruby/test_exception.rb @@ -1034,6 +1034,20 @@ $stderr = $stdout; raise "\x82\xa0"') do |outs, errs, status| assert_match(/^\tfrom #{Regexp.escape(path)}:1:/, warning.first) end + def test_warning_warn_super + assert_in_out_err(%[-W0], "#{<<~"{#"}\n#{<<~'};'}", [], /instance variable @a not initialized/) + {# + module Warning + def warn(message) + super + end + end + + $VERBOSE = true + @a + }; + end + def test_undefined_backtrace assert_separately([], "#{<<-"begin;"}\n#{<<-"end;"}") begin;