From 569a8910af89d3b53ded047243dc43277f546e20 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Mon, 1 Aug 2022 07:25:40 +0900 Subject: [PATCH] bigint.c: check division by zero errors. --- mrbgems/mruby-bigint/core/bigint.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/mrbgems/mruby-bigint/core/bigint.c b/mrbgems/mruby-bigint/core/bigint.c index ef404fb7a..c16a305a7 100644 --- a/mrbgems/mruby-bigint/core/bigint.c +++ b/mrbgems/mruby-bigint/core/bigint.c @@ -1187,6 +1187,9 @@ mrb_bint_div(mrb_state *mrb, mrb_value x, mrb_value y) struct RBigint *b = RBIGINT(x); struct RBigint *b2 = RBIGINT(y); struct RBigint *b3 = bint_new(mrb); + if (b2->mp.sn == 0 || uzero(&b2->mp)) { + mrb_int_zerodiv(mrb); + } mpz_mdiv(mrb, &b3->mp, &b->mp, &b2->mp); return bint_norm(mrb, b3); } @@ -1263,10 +1266,16 @@ mrb_bint_mod(mrb_state *mrb, mrb_value x, mrb_value y) return mrb_float_value(mrb, fmod(v1, v2)); } #endif + if (mrb_integer_p(y) && mrb_integer(y) == 0) { + mrb_int_zerodiv(mrb); + } y = mrb_as_bint(mrb, y); struct RBigint *b = RBIGINT(x); struct RBigint *b2 = RBIGINT(y); struct RBigint *b3 = bint_new(mrb); + if (b2->mp.sn == 0 || uzero(&b2->mp)) { + mrb_int_zerodiv(mrb); + } mpz_mmod(mrb, &b3->mp, &b->mp, &b2->mp); return bint_norm(mrb, b3); } @@ -1276,10 +1285,16 @@ mrb_bint_rem(mrb_state *mrb, mrb_value x, mrb_value y) { /* called from mrbgems/mruby-numeric-ext/src/numeric_ext.c */ /* y should not be float */ + if (mrb_integer_p(y) && mrb_integer(y) == 0) { + mrb_int_zerodiv(mrb); + } + y = mrb_as_bint(mrb, y); struct RBigint *b = RBIGINT(x); struct RBigint *b2 = RBIGINT(y); struct RBigint *b3 = bint_new(mrb); - y = mrb_as_bint(mrb, y); + if (b2->mp.sn == 0 || uzero(&b2->mp)) { + mrb_int_zerodiv(mrb); + } mpz_mod(mrb, &b3->mp, &b->mp, &b2->mp); return bint_norm(mrb, b3); } @@ -1289,11 +1304,17 @@ mrb_bint_divmod(mrb_state *mrb, mrb_value x, mrb_value y) { /* called from src/numeric.c */ /* y should not be float */ + if (mrb_integer_p(y) && mrb_integer(y) == 0) { + mrb_int_zerodiv(mrb); + } y = mrb_as_bint(mrb, y); struct RBigint *b = RBIGINT(x); struct RBigint *b2 = RBIGINT(y); struct RBigint *b3 = bint_new(mrb); struct RBigint *b4 = bint_new(mrb); + if (b2->mp.sn == 0 || uzero(&b2->mp)) { + mrb_int_zerodiv(mrb); + } mpz_mdivmod(mrb, &b3->mp, &b4->mp, &b->mp, &b2->mp); x = bint_norm(mrb, b3); y = bint_norm(mrb, b4);