From 01dbbcd553813c8e26a5f1050822f9cc8e45f51d Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Thu, 27 Aug 2020 09:44:50 +0900 Subject: Handle integer overflow in `rational_s_new`. --- mrbgems/mruby-rational/src/rational.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'mrbgems/mruby-rational') diff --git a/mrbgems/mruby-rational/src/rational.c b/mrbgems/mruby-rational/src/rational.c index 96c378768..58107304a 100644 --- a/mrbgems/mruby-rational/src/rational.c +++ b/mrbgems/mruby-rational/src/rational.c @@ -109,26 +109,27 @@ rational_s_new(mrb_state *mrb, mrb_value self) denominator = mrb_integer(denomv); } else { + mrb_float numf = (mrb_float)numerator; mrb_float denomf = mrb_to_flo(mrb, denomv); - DROP_PRECISION(denomf, numerator, denomf); + DROP_PRECISION(denomf, numf, denomf); + numerator = (mrb_int)numf; denominator = (mrb_int)denomf; } } else { mrb_float numf = mrb_to_flo(mrb, numv); + mrb_float denomf; if (mrb_integer_p(denomv)) { - denominator = mrb_integer(denomv); + denomf = (mrb_float)mrb_integer(denomv); } else { - mrb_float denomf = mrb_to_flo(mrb, denomv); - - DROP_PRECISION(denomf, numf, denomf); - denominator = (mrb_int)denomf; + denomf = mrb_to_flo(mrb, denomv); } - - DROP_PRECISION(numf, numf, denominator); + DROP_PRECISION(denomf, numf, denomf); + DROP_PRECISION(numf, numf, denomf); + denominator = (mrb_int)denomf; numerator = (mrb_int)numf; } #endif -- cgit v1.2.3