From d9b57ab6b1d25685eb82d05fb583c7244e65df33 Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Mon, 28 Nov 2011 13:12:46 +0000 Subject: [PATCH] handling overflow in the fixnum*fixnum case of sexp_mul, which is never reached directly from the vm --- opt/bignum.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/opt/bignum.c b/opt/bignum.c index 33412c4e..87b2075c 100644 --- a/opt/bignum.c +++ b/opt/bignum.c @@ -1113,6 +1113,7 @@ sexp sexp_sub (sexp ctx, sexp a, sexp b) { } sexp sexp_mul (sexp ctx, sexp a, sexp b) { + sexp_lsint_t prod; int at=sexp_number_type(a), bt=sexp_number_type(b), t; sexp r=SEXP_VOID; sexp_gc_var1(tmp); @@ -1127,7 +1128,11 @@ sexp sexp_mul (sexp ctx, sexp a, sexp b) { r = sexp_type_exception(ctx, NULL, SEXP_NUMBER, a); break; case SEXP_NUM_FIX_FIX: - r = sexp_fx_mul(a, b); + prod = (sexp_lsint_t)sexp_unbox_fixnum(a) * sexp_unbox_fixnum(b); + if ((prod < SEXP_MIN_FIXNUM) || (prod > SEXP_MAX_FIXNUM)) + r = sexp_mul(ctx, tmp=sexp_fixnum_to_bignum(ctx, a), b); + else + r = sexp_make_fixnum(prod); break; case SEXP_NUM_FIX_FLO: r = sexp_make_flonum(ctx, sexp_fixnum_to_double(a)*sexp_flonum_value(b));