summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2020-08-27 09:44:50 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2020-10-12 18:20:05 +0900
commit01dbbcd553813c8e26a5f1050822f9cc8e45f51d (patch)
tree7c6e9091b61497004cb82ba6de23d26f340d28d4
parente479a427579e863899ed2bd3c5a90e54a7aa46e1 (diff)
downloadmruby-01dbbcd553813c8e26a5f1050822f9cc8e45f51d.tar.gz
mruby-01dbbcd553813c8e26a5f1050822f9cc8e45f51d.zip
Handle integer overflow in `rational_s_new`.
-rw-r--r--mrbgems/mruby-rational/src/rational.c17
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