diff --git a/mrbgems/mruby-bigint/core/bigint.c b/mrbgems/mruby-bigint/core/bigint.c index 331c30169..71dadf317 100644 --- a/mrbgems/mruby-bigint/core/bigint.c +++ b/mrbgems/mruby-bigint/core/bigint.c @@ -1112,8 +1112,11 @@ mpz_mul(mpz_ctx_t *ctx, mpz_t *ww, mpz_t *u, mpz_t *v) mpz_realloc(ctx, ww, result_size); size_t scratch_size = karatsuba_scratch_size(u->sz, v->sz); - /* Add safety margin to account for rounding in recursive partitioning */ - scratch_size += 8; + /* Add safety margin proportional to scratch size. + * While the calculation is mathematically exact, empirical testing + * (valgrind, oss-fuzz) reveals edge cases requiring extra space. + * Proportional margin scales better than fixed for large inputs. */ + scratch_size += (scratch_size >> 3) + 16; size_t pool_state = pool_save(ctx); mp_limb *scratch = NULL;