From 908d46f662da07175a47db90d46b50cfd40b105d Mon Sep 17 00:00:00 2001
From: Alex Shinn <ashinn@users.noreply.github.com>
Date: Wed, 25 Jun 2014 22:46:34 +0900
Subject: [PATCH] Fixing overflow detection when reading hex bignums.

---
 sexp.c                  | 3 ++-
 tests/numeric-tests.scm | 3 +++
 2 files changed, 5 insertions(+), 1 deletion(-)

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