Giving a proper OOM error on arithmetic-shift with a huge shift.

This commit is contained in:
Alex Shinn 2014-08-03 20:45:26 +09:00
parent a54c49d48a
commit 12b25c01ba
2 changed files with 25 additions and 17 deletions

View file

@ -19,15 +19,19 @@ static int hex_digit (int n) {
sexp sexp_make_bignum (sexp ctx, sexp_uint_t len) {
sexp_uint_t size = sexp_sizeof(bignum) + len*sizeof(sexp_uint_t);
sexp res = sexp_alloc_tagged(ctx, size, SEXP_BIGNUM);
if (!sexp_exceptionp(res)) {
sexp_bignum_length(res) = len;
sexp_bignum_sign(res) = 1;
}
return res;
}
sexp sexp_fixnum_to_bignum (sexp ctx, sexp a) {
sexp res = sexp_make_bignum(ctx, 1);
if (!sexp_exceptionp(res)) {
sexp_bignum_data(res)[0] = sexp_unbox_fixnum(sexp_fx_abs(a));
sexp_bignum_sign(res) = sexp_fx_sign(a);
}
return res;
}

View file

@ -215,6 +215,7 @@ static sexp sexp_arithmetic_shift (sexp ctx, sexp self, sexp_sint_t n, sexp i, s
res = sexp_make_fixnum(sexp_bignum_sign(i) > 0 ? 0 : -1);
} else {
res = sexp_make_bignum(ctx, len - offset + 1);
if (!sexp_exceptionp(res)) {
sexp_bignum_sign(res) = sexp_bignum_sign(i);
for (j=len-offset-1, tmp=0; j>=0; j--) {
sexp_bignum_data(res)[j]
@ -223,11 +224,13 @@ static sexp sexp_arithmetic_shift (sexp ctx, sexp self, sexp_sint_t n, sexp i, s
<< (sizeof(sexp_uint_t)*CHAR_BIT-bit_shift);
}
}
}
} else {
offset = c / (sizeof(sexp_uint_t)*CHAR_BIT);
bit_shift = c - offset*(sizeof(sexp_uint_t)*CHAR_BIT);
tail_shift = (sizeof(sexp_uint_t)*CHAR_BIT-bit_shift);
res = sexp_make_bignum(ctx, len + offset + 1);
if (!sexp_exceptionp(res)) {
sexp_bignum_sign(res) = sexp_bignum_sign(i);
for (j=tmp=0; j<len; j++) {
sexp_bignum_data(res)[j+offset]
@ -237,6 +240,7 @@ static sexp sexp_arithmetic_shift (sexp ctx, sexp self, sexp_sint_t n, sexp i, s
}
if (bit_shift != 0) sexp_bignum_data(res)[len+offset] = tmp;
}
}
#endif
} else {
res = sexp_type_exception(ctx, self, SEXP_FIXNUM, i);