summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-12-31 14:27:20 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-12-31 14:27:20 +0000
commitde3f2adb53561c99630478e8372326c0d0a63153 (patch)
treefdb5396870cf2d3b92dc410a0ce8d03ec43e13ce
parentaaf78dec43d85058d56dda5518fc757398ccf781 (diff)
* string.c (rb_str_resize): embeds if ptr is null. [ruby-dev:32819]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14817 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog4
-rw-r--r--bootstraptest/test_knownbug.rb5
-rw-r--r--string.c20
-rw-r--r--test/ruby/test_string.rb3
4 files changed, 23 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 2eaa1a2604..b6b88404dc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Mon Dec 31 23:27:17 2007 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_str_resize): embeds if ptr is null. [ruby-dev:32819]
+
Mon Dec 31 23:17:22 2007 GOTOU Yuuzou <gotoyuzo@notwork.org>
* lib/webrick/httpproxy.rb (WEBrick::HTTPProxyServer#proxy_service):
diff --git a/bootstraptest/test_knownbug.rb b/bootstraptest/test_knownbug.rb
index 9ecc7dfac7..2d260137c2 100644
--- a/bootstraptest/test_knownbug.rb
+++ b/bootstraptest/test_knownbug.rb
@@ -4,11 +4,6 @@
#
assert_normal_exit %q{
- null = File.exist?("/dev/null") ? "/dev/null" : "NUL" # maybe DOSISH
- File.read(null).clone
-}, '[ruby-dev:32819] reported by Kazuhiro NISHIYAMA'
-
-assert_normal_exit %q{
class Foo
def self.add_method
class_eval("def some-bad-name; puts 'hello' unless @some_variable.some_function(''); end")
diff --git a/string.c b/string.c
index b6bbddb544..d569ce5447 100644
--- a/string.c
+++ b/string.c
@@ -924,25 +924,37 @@ rb_str_set_len(VALUE str, long len)
VALUE
rb_str_resize(VALUE str, long len)
{
+ long slen;
+
if (len < 0) {
rb_raise(rb_eArgError, "negative string size (or size too big)");
}
rb_str_modify(str);
- if (len != RSTRING_LEN(str)) {
+ slen = RSTRING_LEN(str);
+ if (len != slen) {
if (STR_EMBED_P(str)) {
char *ptr;
if (len <= RSTRING_EMBED_LEN_MAX) {
STR_SET_EMBED_LEN(str, len);
- RSTRING_PTR(str)[len] = '\0';
+ RSTRING(str)->as.ary[len] = '\0';
return str;
}
ptr = ALLOC_N(char,len+1);
- MEMCPY(ptr, RSTRING_PTR(str), char, RSTRING_LEN(str));
+ MEMCPY(ptr, RSTRING(str)->as.ary, char, slen);
RSTRING(str)->as.heap.ptr = ptr;
STR_SET_NOEMBED(str);
}
- else if (RSTRING_LEN(str) < len || RSTRING_LEN(str) - len > 1024) {
+ else if (len <= RSTRING_EMBED_LEN_MAX) {
+ char *ptr = RSTRING(str)->as.heap.ptr;
+ STR_SET_EMBED(str);
+ MEMCPY(RSTRING(str)->as.ary, ptr, char, len);
+ RSTRING(str)->as.ary[len] = '\0';
+ STR_SET_EMBED_LEN(str, len);
+ xfree(ptr);
+ return str;
+ }
+ else if (slen < len || slen - len > 1024) {
REALLOC_N(RSTRING(str)->as.heap.ptr, char, len+1);
}
if (!STR_NOCAPA_P(str)) {
diff --git a/test/ruby/test_string.rb b/test/ruby/test_string.rb
index 7af6dcd11c..5cdacf3483 100644
--- a/test/ruby/test_string.rb
+++ b/test/ruby/test_string.rb
@@ -368,6 +368,9 @@ class TestString < Test::Unit::TestCase
assert_equal(a.tainted?, b.tainted?)
end
end
+
+ null = File.exist?("/dev/null") ? "/dev/null" : "NUL" # maybe DOSISH
+ assert_equal("", File.read(null).clone, '[ruby-dev:32819] reported by Kazuhiro NISHIYAMA')
end
def test_concat