* string.c (rb_str_resize): should copy the content properly. a

patch from Jeremy Evans at [ruby-core:31615].


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@28851 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2010-08-04 07:09:47 +00:00
Родитель c37b2ef8dc
Коммит 99d96a89ce
5 изменённых файлов: 35 добавлений и 1 удалений

Просмотреть файл

@ -1,3 +1,8 @@
Wed Aug 4 16:09:43 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
* string.c (rb_str_resize): should copy the content properly. a
patch from Jeremy Evans at [ruby-core:31615].
Wed Aug 4 15:47:21 2010 NAKAMURA Usaku <usa@ruby-lang.org>
* lib/mkmf.rb (create_makefile): no need to create the directory

16
ext/-test-/bug-3652/bug.c Normal file
Просмотреть файл

@ -0,0 +1,16 @@
#include <ruby.h>
static VALUE
bug_str_resize(VALUE self, VALUE init, VALUE repl)
{
long initlen = NUM2LONG(init);
VALUE s = rb_str_buf_new(initlen);
return rb_str_resize(s, strlcpy(RSTRING_PTR(s), StringValueCStr(repl), (size_t)initlen));
}
void
Init_bug(void)
{
VALUE mBug = rb_define_module("Bug");
rb_define_module_function(mBug, "str_resize", bug_str_resize, 2);
}

Просмотреть файл

@ -0,0 +1 @@
create_makefile("-test-/bug-3652/bug")

Просмотреть файл

@ -1723,7 +1723,7 @@ rb_str_resize(VALUE str, long len)
else if (len <= RSTRING_EMBED_LEN_MAX) {
char *ptr = RSTRING(str)->as.heap.ptr;
STR_SET_EMBED(str);
if (slen > 0) MEMCPY(RSTRING(str)->as.ary, ptr, char, len);
if (len > 0) MEMCPY(RSTRING(str)->as.ary, ptr, char, len);
RSTRING(str)->as.ary[len] = '\0';
STR_SET_EMBED_LEN(str, len);
if (independent) xfree(ptr);

Просмотреть файл

@ -0,0 +1,12 @@
require 'test/unit'
require '-test-/bug-3652/bug'
class Test_BUG_3652 < Test::Unit::TestCase
def test_block_call_id
bug3652 = '[ruby-core:31615]'
s = "123456789012345678901234"
assert_equal(s, Bug.str_resize(127, s), bug3652)
s = "123456789"
assert_equal(s, Bug.str_resize(127, s), bug3652)
end
end