From 9af061a4ce8462e37c05fd41a66a99aac4e057ba Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Mon, 9 Dec 2024 13:09:59 +0900 Subject: [PATCH] mruby-bigint: fixed a bug in string conversion; ref #6444 --- mrbgems/mruby-bigint/core/bigint.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/mrbgems/mruby-bigint/core/bigint.c b/mrbgems/mruby-bigint/core/bigint.c index b301c0372..77548f786 100644 --- a/mrbgems/mruby-bigint/core/bigint.c +++ b/mrbgems/mruby-bigint/core/bigint.c @@ -364,12 +364,6 @@ mpz_sub_int(mrb_state *mrb, mpz_t *x, mrb_int n) mpz_set_int(mrb, x, n); return; } - #if 0 - if (x->sn < 0) { - mpz_add_int(mrb, x, n); - return; - } - #endif // Initialize borrow and start decrement mp_dbl_limb_signed borrow = (mp_limb)n; @@ -901,7 +895,7 @@ mpz_get_str(mrb_state *mrb, char *s, mrb_int sz, mrb_int base, mpz_t *x) mp_limb *t = (mp_limb*)mrb_malloc(mrb, xlen*sizeof(mp_limb)); mp_limb *tend = t + xlen; memcpy(t, x->p, xlen*sizeof(mp_limb)); - mp_limb b2 = base_limit[(base-3)]; + mp_limb b2 = base_limit[base-3]; for (;;) { mp_limb *d = tend; @@ -914,12 +908,12 @@ mpz_get_str(mrb_state *mrb, char *s, mrb_int sz, mrb_int base, mpz_t *x) } // convert to character - while (a > 0) { - mp_limb a0 = (mp_limb)(a % base); + for (mp_limb b=b2/base; b>0; b/=base) { + char a0 = (char)(a % base); if (a0 < 10) a0 += '0'; else a0 += 'a' - 10; if (s == se) break; - *s++ = (char)a0; + *s++ = a0; a /= base; }