Fix the integer overflow in mrb_str_len_to_inum().

This commit is contained in:
Yukihiro "Matz" Matsumoto
2020-12-23 10:33:31 +09:00
parent 8b2fd45d46
commit 0bb4afe942
+5 -9
View File
@@ -2345,16 +2345,12 @@ mrb_str_len_to_inum(mrb_state *mrb, const char *str, size_t len, mrb_int base, i
}
n *= base;
n += c;
if (n > (uint64_t)MRB_INT_MAX + (sign ? 0 : 1)) {
#ifndef MRB_NO_FLOAT
if (base == 10) {
return mrb_float_value(mrb, mrb_str_to_dbl(mrb, mrb_str_new(mrb, str, len), badcheck));
}
else
#endif
{
mrb_raisef(mrb, E_RANGE_ERROR, "string (%l) too big for integer", str, pend-str);
if (n > (uint64_t)MRB_INT_MAX) {
if (sign == 0 && n == (uint64_t)MRB_INT_MIN) {
sign = 1;
break;
}
mrb_raisef(mrb, E_RANGE_ERROR, "string (%l) too big for integer", str, pend-str);
}
}
val = (mrb_int)n;