diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-08-27 09:44:50 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-10-12 18:20:05 +0900 |
| commit | 01dbbcd553813c8e26a5f1050822f9cc8e45f51d (patch) | |
| tree | 7c6e9091b61497004cb82ba6de23d26f340d28d4 /mrbgems/mruby-rational | |
| parent | e479a427579e863899ed2bd3c5a90e54a7aa46e1 (diff) | |
| download | mruby-01dbbcd553813c8e26a5f1050822f9cc8e45f51d.tar.gz mruby-01dbbcd553813c8e26a5f1050822f9cc8e45f51d.zip | |
Handle integer overflow in `rational_s_new`.
Diffstat (limited to 'mrbgems/mruby-rational')
| -rw-r--r-- | mrbgems/mruby-rational/src/rational.c | 17 |
1 files changed, 9 insertions, 8 deletions
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 |
