summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-01-28 02:25:44 +0000
committeryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-01-28 02:25:44 +0000
commitce02662c0b256949db67f684bdfcf0ffa602ba66 (patch)
treeea4f6aa7c7d6f107a8dea946da7632bbec0683c1
parent22955e9b4d5e853f8f7aaef23c8ccb9df34af2ec (diff)
merges r30648 from trunk into ruby_1_9_2.
-- * string.c (rb_string_value_cstr): rb_str_modify can change RSTRING_PTR. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_2@30694 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--ext/-test-/string/cstr.c20
-rw-r--r--string.c6
-rw-r--r--test/-ext-/string/test_cstr.rb17
-rw-r--r--version.h2
5 files changed, 48 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 168325762c..1da731e332 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Tue Jan 25 07:00:52 2011 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_string_value_cstr): rb_str_modify can change
+ RSTRING_PTR.
+
Tue Jan 25 07:48:22 2011 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
* test/ruby/test_thread.rb: remove unused variables.
diff --git a/ext/-test-/string/cstr.c b/ext/-test-/string/cstr.c
new file mode 100644
index 0000000000..d4ff360575
--- /dev/null
+++ b/ext/-test-/string/cstr.c
@@ -0,0 +1,20 @@
+#include "ruby.h"
+
+static VALUE
+bug_str_cstr_term(VALUE str)
+{
+ long len;
+ char *s;
+ rb_str_modify(str);
+ len = RSTRING_LEN(str);
+ RSTRING_PTR(str)[len] = 'x';
+ s = StringValueCStr(str);
+ rb_gc();
+ return INT2NUM(s[len]);
+}
+
+void
+Init_cstr(VALUE klass)
+{
+ rb_define_method(klass, "cstr_term", bug_str_cstr_term, 0);
+}
diff --git a/string.c b/string.c
index 542aaff0ee..368eb63463 100644
--- a/string.c
+++ b/string.c
@@ -1381,7 +1381,11 @@ rb_string_value_cstr(volatile VALUE *ptr)
if (!s || memchr(s, 0, len)) {
rb_raise(rb_eArgError, "string contains null byte");
}
- if (s[len]) rb_str_modify(str);
+ if (s[len]) {
+ rb_str_modify(str);
+ s = RSTRING_PTR(str);
+ s[RSTRING_LEN(str)] = 0;
+ }
return s;
}
diff --git a/test/-ext-/string/test_cstr.rb b/test/-ext-/string/test_cstr.rb
new file mode 100644
index 0000000000..8c0bb136ad
--- /dev/null
+++ b/test/-ext-/string/test_cstr.rb
@@ -0,0 +1,17 @@
+require 'test/unit'
+require "-test-/string/string"
+
+class Test_StringCStr < Test::Unit::TestCase
+ Bug4319 = '[ruby-dev:43094]'
+
+ def test_embed
+ s = Bug::String.new("abcdef")
+ s.set_len(3)
+ assert_equal(0, s.cstr_term, Bug4319)
+ end
+
+ def test_long
+ s = Bug::String.new("abcdef")*100000
+ assert_equal(0, s.cstr_term, Bug4319)
+ end
+end
diff --git a/version.h b/version.h
index d7c3d7886d..1b85269659 100644
--- a/version.h
+++ b/version.h
@@ -1,5 +1,5 @@
#define RUBY_VERSION "1.9.2"
-#define RUBY_PATCHLEVEL 171
+#define RUBY_PATCHLEVEL 172
#define RUBY_VERSION_MAJOR 1
#define RUBY_VERSION_MINOR 9
#define RUBY_VERSION_TEENY 1