summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-06-17 09:02:52 -0700
committerKaz Kylheku <kaz@kylheku.com>2017-06-17 09:02:52 -0700
commit7dc634268cb7e33b02462667c1827e7dc146c4ad (patch)
tree937c8ad2baede33fe9ee1db0686df865f9cbdfe8
parente640d29522bd832f88874a6c955e14031481e380 (diff)
downloadtxr-7dc634268cb7e33b02462667c1827e7dc146c4ad.tar.gz
txr-7dc634268cb7e33b02462667c1827e7dc146c4ad.tar.bz2
txr-7dc634268cb7e33b02462667c1827e7dc146c4ad.zip
ash: check range of bits argument.
mp_shift takes an int argument, but we decode bits to a cnum, leaving possible room for overflow, such as when cnum is 64 bits and int is 32. If the value * arith.c (ash): Check that the value is in the range of INT_MIN to INT_MAX.
-rw-r--r--arith.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/arith.c b/arith.c
index 93341d3c..8f268f95 100644
--- a/arith.c
+++ b/arith.c
@@ -2446,6 +2446,8 @@ val ash(val a, val bits)
a = bignum(an);
/* fallthrough */
case BGNUM:
+ if (bn < INT_MIN || bn > INT_MAX)
+ goto bad4;
b = make_bignum();
if (mp_shift(mp(a), mp(b), bn) != MP_OKAY)
goto bad;
@@ -2480,6 +2482,9 @@ bad2:
bad3:
uw_throwf(error_s, lit("ash: non-integral operand ~s"), a, nao);
+
+bad4:
+ uw_throwf(error_s, lit("ash: bit value too large ~s"), bits, nao);
}
val bit(val a, val bit)