diff --git a/sexp.c b/sexp.c index 146f3b89..bd43fe10 100644 --- a/sexp.c +++ b/sexp.c @@ -2621,7 +2621,8 @@ sexp sexp_read_number (sexp ctx, sexp in, int base) { break; tmp = val * base + digit; #if SEXP_USE_BIGNUMS - if ((tmp < val) || (tmp > SEXP_MAX_FIXNUM)) { + if ((SEXP_MAX_FIXNUM / base < val) || + (tmp < val) || (tmp > SEXP_MAX_FIXNUM)) { sexp_push_char(ctx, c, in); return sexp_read_bignum(ctx, in, val, (negativep ? -1 : 1), base); } diff --git a/tests/numeric-tests.scm b/tests/numeric-tests.scm index b89c1a7b..6fc7c06e 100644 --- a/tests/numeric-tests.scm +++ b/tests/numeric-tests.scm @@ -167,6 +167,9 @@ (test #f (>= -inf.0 +inf.0)) (test #f (> -inf.0 +inf.0)) +(test 88962710306127702866241727433142015 + (string->number "#x00112233445566778899aabbccddeeff")) + (test (expt 10 154) (sqrt (expt 10 308))) (test 36893488147419103231