* 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
This commit is contained in:
parent
aaf78dec43
commit
de3f2adb53
@ -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>
|
Mon Dec 31 23:17:22 2007 GOTOU Yuuzou <gotoyuzo@notwork.org>
|
||||||
|
|
||||||
* lib/webrick/httpproxy.rb (WEBrick::HTTPProxyServer#proxy_service):
|
* lib/webrick/httpproxy.rb (WEBrick::HTTPProxyServer#proxy_service):
|
||||||
|
@ -3,11 +3,6 @@
|
|||||||
# So all tests will cause failure.
|
# So all tests will cause failure.
|
||||||
#
|
#
|
||||||
|
|
||||||
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{
|
assert_normal_exit %q{
|
||||||
class Foo
|
class Foo
|
||||||
def self.add_method
|
def self.add_method
|
||||||
|
20
string.c
20
string.c
@ -924,25 +924,37 @@ rb_str_set_len(VALUE str, long len)
|
|||||||
VALUE
|
VALUE
|
||||||
rb_str_resize(VALUE str, long len)
|
rb_str_resize(VALUE str, long len)
|
||||||
{
|
{
|
||||||
|
long slen;
|
||||||
|
|
||||||
if (len < 0) {
|
if (len < 0) {
|
||||||
rb_raise(rb_eArgError, "negative string size (or size too big)");
|
rb_raise(rb_eArgError, "negative string size (or size too big)");
|
||||||
}
|
}
|
||||||
|
|
||||||
rb_str_modify(str);
|
rb_str_modify(str);
|
||||||
if (len != RSTRING_LEN(str)) {
|
slen = RSTRING_LEN(str);
|
||||||
|
if (len != slen) {
|
||||||
if (STR_EMBED_P(str)) {
|
if (STR_EMBED_P(str)) {
|
||||||
char *ptr;
|
char *ptr;
|
||||||
if (len <= RSTRING_EMBED_LEN_MAX) {
|
if (len <= RSTRING_EMBED_LEN_MAX) {
|
||||||
STR_SET_EMBED_LEN(str, len);
|
STR_SET_EMBED_LEN(str, len);
|
||||||
RSTRING_PTR(str)[len] = '\0';
|
RSTRING(str)->as.ary[len] = '\0';
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
ptr = ALLOC_N(char,len+1);
|
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;
|
RSTRING(str)->as.heap.ptr = ptr;
|
||||||
STR_SET_NOEMBED(str);
|
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);
|
REALLOC_N(RSTRING(str)->as.heap.ptr, char, len+1);
|
||||||
}
|
}
|
||||||
if (!STR_NOCAPA_P(str)) {
|
if (!STR_NOCAPA_P(str)) {
|
||||||
|
@ -368,6 +368,9 @@ class TestString < Test::Unit::TestCase
|
|||||||
assert_equal(a.tainted?, b.tainted?)
|
assert_equal(a.tainted?, b.tainted?)
|
||||||
end
|
end
|
||||||
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
|
end
|
||||||
|
|
||||||
def test_concat
|
def test_concat
|
||||||
|
Loading…
x
Reference in New Issue
Block a user