--- array.old.c 2008-04-22 11:19:35.000000000 -0700 +++ array.c 2008-04-22 11:23:38.000000000 -0700 @@ -367,8 +367,8 @@ new_capa = ARY_DEFAULT_SIZE; } new_capa += idx; - if (new_capa * (long)sizeof(VALUE) <= new_capa) { - rb_raise(rb_eArgError, "index too big"); + if (new_capa < 0 || new_capa > LONG_MAX / sizeof(VALUE)) { + rb_raise(rb_eArgError, "index too big"); } REALLOC_N(RARRAY(ary)->ptr, VALUE, new_capa); RARRAY(ary)->aux.capa = new_capa;