From e5c516c89a62839fd025ae112041ed9a5f06c9d0 Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 11 Feb 2015 02:01:36 +0000 Subject: generator.c: fix infinite recursion * ext/json/generator/generator.c (generate_json): get rid of unnecessary recursive calls which can cause infinite recursion. T_STRING may not have rb_cString. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@49562 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ ext/json/generator/generator.c | 2 +- test/json/test_json_generate.rb | 10 ++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 0f2ba38735..98c376d22e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Wed Feb 11 11:01:33 2015 Nobuyoshi Nakada + + * ext/json/generator/generator.c (generate_json): get rid of + unnecessary recursive calls which can cause infinite recursion. + T_STRING may not have rb_cString. + Wed Feb 11 07:53:35 2015 Masaki Suketa * test/win32ole/test_word.rb: use skip method to skip test. diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c index 7805cde960..9641ecbb58 100644 --- a/ext/json/generator/generator.c +++ b/ext/json/generator/generator.c @@ -880,7 +880,7 @@ static void generate_json(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *s } else { tmp = rb_funcall(obj, i_to_s, 0); Check_Type(tmp, T_STRING); - generate_json(buffer, Vstate, state, tmp); + generate_json_string(buffer, Vstate, state, tmp); } } diff --git a/test/json/test_json_generate.rb b/test/json/test_json_generate.rb index 8db0b7890b..1834290944 100755 --- a/test/json/test_json_generate.rb +++ b/test/json/test_json_generate.rb @@ -334,4 +334,14 @@ EOT assert_equal true, JSON.generate(["\xea"]) end end + + def test_string_subclass + s = Class.new(String) do + def to_s; self; end + undef to_json + end + assert_nothing_raised(SystemStackError) do + assert_equal '[""]', JSON.generate([s.new]) + end + end end -- cgit v1.2.3