From 555035a349bb9d7659317dc65dc68ce6e2e6aaa7 Mon Sep 17 00:00:00 2001 From: nagachika Date: Tue, 7 May 2013 16:49:01 +0000 Subject: merge revision(s) 40208: [Backport #8380] * internal.h (MUL_OVERFLOW_SIGNED_INTEGER_P): New macro. (MUL_OVERFLOW_FIXNUM_P): Ditto. (MUL_OVERFLOW_LONG_P): Ditto. * array.c (rb_ary_product): Don't overflow on signed integer multiplication. * numeric.c (fix_mul): Ditto. (int_pow): Ditto. * rational.c (f_imul): Ditto. * insns.def (opt_mult): Ditto. * thread.c (sleep_timeval): Don't overflow on signed integer addition. * bignum.c (rb_int2big): Don't overflow on signed integer negation. (rb_big2ulong): Ditto. (rb_big2long): Ditto. (rb_big2ull): Ditto. (rb_big2ll): Ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_0_0@40602 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- array.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'array.c') diff --git a/array.c b/array.c index ff2dc671ba..4c8bf1e51b 100644 --- a/array.c +++ b/array.c @@ -5035,15 +5035,14 @@ rb_ary_product(int argc, VALUE *argv, VALUE ary) else { /* Compute the length of the result array; return [] if any is empty */ for (i = 0; i < n; i++) { - long k = RARRAY_LEN(arrays[i]), l = resultlen; + long k = RARRAY_LEN(arrays[i]); if (k == 0) { result = rb_ary_new2(0); goto done; } - resultlen *= k; - if (resultlen < k || resultlen < l || resultlen / k != l) { + if (MUL_OVERFLOW_LONG_P(resultlen, k)) rb_raise(rb_eRangeError, "too big to product"); - } + resultlen *= k; } result = rb_ary_new2(resultlen); } -- cgit v1.2.3