From e479a427579e863899ed2bd3c5a90e54a7aa46e1 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Thu, 27 Aug 2020 09:43:56 +0900 Subject: Handle potential overflow in `int_div` and `flo_idiv`. --- src/numeric.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/numeric.c b/src/numeric.c index a5fb87940..f6c2c57a1 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -120,7 +120,10 @@ int_div(mrb_state *mrb, mrb_value xv) mrb_get_args(mrb, "o", &yv); if (mrb_float_p(yv)) { - return mrb_fixnum_value((mrb_int)((mrb_float)mrb_integer(xv)/mrb_float(yv))); + double d = mrb_integer(xv)/mrb_float(yv); + if (MRB_INT_MIN <= d && d <= MRB_INT_MAX) + return mrb_int_value(mrb, (mrb_int)d); + return mrb_float_value(mrb, d); } else #endif @@ -202,7 +205,10 @@ flo_idiv(mrb_state *mrb, mrb_value x) mrb_float y; mrb_get_args(mrb, "f", &y); - return mrb_int_value(mrb, (mrb_int)(mrb_to_flo(mrb, x) / y)); + y = mrb_to_flo(mrb, x) / y; + if (MRB_INT_MIN <= y && y <= MRB_INT_MAX) + return mrb_int_value(mrb, (mrb_int)y); + return mrb_float_value(mrb, y); } static mrb_value -- cgit v1.2.3