diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | ext/-test-/bug-3652/bug.c | 16 | ||||
-rw-r--r-- | ext/-test-/bug-3652/extconf.rb | 1 | ||||
-rw-r--r-- | string.c | 2 | ||||
-rw-r--r-- | test/-ext-/test_bug-3652.rb | 12 |
5 files changed, 35 insertions, 1 deletions
@@ -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 diff --git a/ext/-test-/bug-3652/bug.c b/ext/-test-/bug-3652/bug.c new file mode 100644 index 0000000000..290ac2ddee --- /dev/null +++ b/ext/-test-/bug-3652/bug.c @@ -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); +} diff --git a/ext/-test-/bug-3652/extconf.rb b/ext/-test-/bug-3652/extconf.rb new file mode 100644 index 0000000000..44f57b41c8 --- /dev/null +++ b/ext/-test-/bug-3652/extconf.rb @@ -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); diff --git a/test/-ext-/test_bug-3652.rb b/test/-ext-/test_bug-3652.rb new file mode 100644 index 0000000000..0e4d658081 --- /dev/null +++ b/test/-ext-/test_bug-3652.rb @@ -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 |