ruby-changes:37324
From: nobu <ko1@a...>
Date: Mon, 26 Jan 2015 11:38:06 +0900 (JST)
Subject: [ruby-changes:37324] nobu:r49405 (trunk): string.c: terminate when embedded
nobu 2015-01-26 11:37:51 +0900 (Mon, 26 Jan 2015) New Revision: 49405 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=49405 Log: string.c: terminate when embedded * string.c (str_make_independent_expand): terminate String when moved from heap to embedded. [Fix GH-821]. Modified files: trunk/ChangeLog trunk/string.c trunk/test/-ext-/string/test_cstr.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 49404) +++ ChangeLog (revision 49405) @@ -1,3 +1,8 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Mon Jan 26 11:37:49 2015 Dave Stevens <dave@c...> + + * string.c (str_make_independent_expand): terminate String when + moved from heap to embedded. [Fix GH-821]. + Sun Jan 25 12:04:12 2015 Nobuyoshi Nakada <nobu@r...> * array.c (flatten): no need to call to_ary method on elements Index: string.c =================================================================== --- string.c (revision 49404) +++ string.c (revision 49405) @@ -1593,6 +1593,7 @@ str_make_independent_expand(VALUE str, l https://github.com/ruby/ruby/blob/trunk/string.c#L1593 ptr = RSTRING(str)->as.heap.ptr; STR_SET_EMBED(str); memcpy(RSTRING(str)->as.ary, ptr, len); + RSTRING(str)->as.ary[len] = '\0'; /* Ensure string is terminated */ STR_SET_EMBED_LEN(str, len); return; } Index: test/-ext-/string/test_cstr.rb =================================================================== --- test/-ext-/string/test_cstr.rb (revision 49404) +++ test/-ext-/string/test_cstr.rb (revision 49405) @@ -86,6 +86,15 @@ class Test_StringCStr < Test::Unit::Test https://github.com/ruby/ruby/blob/trunk/test/-ext-/string/test_cstr.rb#L86 } end + def test_embedded_from_heap + gh821 = "[GH-821]" + embedded_string = "abcdefghi" + string = embedded_string.gsub("efg", "123") + {}[string] = 1 + non_terminated = "#{string}#{nil}" + assert_nil(Bug::String.cstr_term_char(non_terminated), gh821) + end + def assert_wchars_term_char(str) result = {} WCHARS.map do |enc| -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/