[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]