diff --git a/ChangeLog b/ChangeLog index 9b9e186a09..72bcbe5c12 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Thu Jan 14 09:34:31 2010 NARUSE, Yui + + * string.c (rb_str_concat): raise RangeError when the argument is + negative value. [ruby-core:27583] + Thu Jan 14 08:49:59 2010 Tanaka Akira * time.c (time_to_r): convert to rational if internal representation diff --git a/string.c b/string.c index 29e84e3ffe..a89cca0050 100644 --- a/string.c +++ b/string.c @@ -1983,7 +1983,18 @@ rb_str_append(VALUE str, VALUE str2) VALUE rb_str_concat(VALUE str1, VALUE str2) { - if (FIXNUM_P(str2) || TYPE(str2) == T_BIGNUM) { + if (FIXNUM_P(str2)) { + if (NEGFIXABLE(str2)) + rb_raise(rb_eRangeError, "negative argument"); + } + else if (TYPE(str2) == T_BIGNUM) { + if (!RBIGNUM_SIGN(str2)) + rb_raise(rb_eRangeError, "negative argument"); + } + else { + return rb_str_append(str1, str2); + } + { rb_encoding *enc = STR_ENC_GET(str1); unsigned int c = NUM2UINT(str2); long pos = RSTRING_LEN(str1); @@ -1995,7 +2006,6 @@ rb_str_concat(VALUE str1, VALUE str2) ENC_CODERANGE_SET(str1, cr); return str1; } - return rb_str_append(str1, str2); } st_index_t