summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean Boussier <jean.boussier@gmail.com>2020-05-07 21:49:40 +0200
committerAaron Patterson <aaron.patterson@gmail.com>2020-05-11 09:15:24 -0700
commit1258a0fb90ea63bf1ec108815cce0d552acfc726 (patch)
treeb059dab4e959a08791777651b133d80c8459333f
parent15e977349e31389515bccf7a9684005a0c36e02d (diff)
Remove the 65 size limit for name_err_mesg_to_str
This limit was introduced on Nov 20 1996 in 554b989ba1623b9f6a0b76f00824c83a23fbcbc1 Apparently to protect from a buffer overflow: * eval.c (f_missing): オブジェクトの文字列表現が長すぎる時バッファ を書き潰していた However I tested that path with very large strings and it works fine.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/3090
-rw-r--r--error.c2
-rw-r--r--test/ruby/test_name_error.rb13
2 files changed, 14 insertions, 1 deletions
diff --git a/error.c b/error.c
index 09d5787ad5..4912869e43 100644
--- a/error.c
+++ b/error.c
@@ -1791,7 +1791,7 @@ name_err_mesg_to_str(VALUE obj)
d = rb_protect(rb_inspect, obj, &state);
if (state)
rb_set_errinfo(Qnil);
- if (NIL_P(d) || RSTRING_LEN(d) > 65) {
+ if (NIL_P(d)) {
d = rb_any_to_s(obj);
}
singleton = (RSTRING_LEN(d) > 0 && RSTRING_PTR(d)[0] == '#');
diff --git a/test/ruby/test_name_error.rb b/test/ruby/test_name_error.rb
index 102a4a67e8..ec03046c22 100644
--- a/test/ruby/test_name_error.rb
+++ b/test/ruby/test_name_error.rb
@@ -127,4 +127,17 @@ class TestNameError < Test::Unit::TestCase
-> {require ARGV[0]}.call
end;
end
+
+ def test_large_receiver_inspect
+ receiver = Class.new do
+ def self.inspect
+ 'A' * 120
+ end
+ end
+
+ error = assert_raise(NameError) do
+ receiver::FOO
+ end
+ assert_equal "uninitialized constant #{'A' * 120}::FOO", error.message
+ end
end