From ef1974099deeb3df3f41026e02d6ac93cd4684ee Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Fri, 26 Aug 2022 12:10:22 +0900 Subject: [PATCH] bigint.c (mrb_bint_powm): check zero division first. --- mrbgems/mruby-bigint/core/bigint.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mrbgems/mruby-bigint/core/bigint.c b/mrbgems/mruby-bigint/core/bigint.c index fea4782a49..e3856562be 100644 --- a/mrbgems/mruby-bigint/core/bigint.c +++ b/mrbgems/mruby-bigint/core/bigint.c @@ -1380,8 +1380,10 @@ mrb_bint_powm(mrb_state *mrb, mrb_value x, mrb_int exp, mrb_value mod) switch (mrb_type(mod)) { case MRB_TT_INTEGER: { + mrb_int m = mrb_integer(mod); + if (m == 0) mrb_int_zerodiv(mrb); struct RBigint *b2 = bint_new(mrb); - struct RBigint *b3 = bint_new_int(mrb, mrb_integer(mod)); + struct RBigint *b3 = bint_new_int(mrb, m); mpz_powm(mrb, &b2->mp, &b->mp, exp, &b3->mp); return mrb_obj_value(b3); } @@ -1389,6 +1391,7 @@ mrb_bint_powm(mrb_state *mrb, mrb_value x, mrb_int exp, mrb_value mod) { struct RBigint *b2 = bint_new(mrb); struct RBigint *b3 = RBIGINT(mod); + if (uzero(&b3->mp)) mrb_int_zerodiv(mrb); mpz_powm(mrb, &b2->mp, &b->mp, exp, &b3->mp); return bint_norm(mrb, b3); }