commit 33706f35b34af2c6c47abce5299fe76d7c1e1594
parent 6300bc3a849ad4aab8e3c5bfea75a3ca74243aa1
Author: Fabrice Bellard <fabrice@bellard.org>
Date: Tue, 5 Dec 2023 17:25:03 +0100
added missing bignum error tests (github issue #159)
Diffstat:
| M | quickjs/quickjs.c | | | 76 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------ |
1 file changed, 64 insertions(+), 12 deletions(-)
diff --git a/quickjs/quickjs.c b/quickjs/quickjs.c
@@ -10611,6 +10611,10 @@ static __maybe_unused JSValue JS_ToIntegerFree(JSContext *ctx, JSValue val)
BOOL is_nan;
a = JS_ToBigFloat(ctx, &a_s, val);
+ if (!a) {
+ JS_FreeValue(ctx, val);
+ return JS_EXCEPTION;
+ }
if (!bf_is_finite(a)) {
is_nan = bf_is_nan(a);
if (is_nan)
@@ -11200,6 +11204,10 @@ static JSValue js_ftoa(JSContext *ctx, JSValueConst val1, int radix,
if (JS_IsException(val))
return val;
a = JS_ToBigFloat(ctx, &a_s, val);
+ if (!a) {
+ JS_FreeValue(ctx, val);
+ return JS_EXCEPTION;
+ }
saved_sign = a->sign;
if (a->expn == BF_EXP_ZERO)
a->sign = 0;
@@ -11256,6 +11264,8 @@ static JSValue js_bigdecimal_to_string1(JSContext *ctx, JSValueConst val,
int saved_sign;
a = JS_ToBigDecimal(ctx, val);
+ if (!a)
+ return JS_EXCEPTION;
saved_sign = a->sign;
if (a->expn == BF_EXP_ZERO)
a->sign = 0;
@@ -12713,6 +12723,11 @@ static int js_unary_arith_bigfloat(JSContext *ctx,
}
r = JS_GetBigFloat(res);
a = JS_ToBigFloat(ctx, &a_s, op1);
+ if (!a) {
+ JS_FreeValue(ctx, res);
+ JS_FreeValue(ctx, op1);
+ return -1;
+ }
ret = 0;
switch(op) {
case OP_inc:
@@ -12762,6 +12777,11 @@ static int js_unary_arith_bigdecimal(JSContext *ctx,
}
r = JS_GetBigDecimal(res);
a = JS_ToBigDecimal(ctx, op1);
+ if (!a) {
+ JS_FreeValue(ctx, res);
+ JS_FreeValue(ctx, op1);
+ return -1;
+ }
ret = 0;
switch(op) {
case OP_inc:
@@ -12810,6 +12830,11 @@ static int js_unary_arith_bigint(JSContext *ctx,
}
r = JS_GetBigInt(res);
a = JS_ToBigInt(ctx, &a_s, op1);
+ if (!a) {
+ JS_FreeValue(ctx, res);
+ JS_FreeValue(ctx, op1);
+ return -1;
+ }
ret = 0;
switch(op) {
case OP_inc:
@@ -13168,14 +13193,21 @@ static int js_binary_arith_bigfloat(JSContext *ctx, OPCodeEnum op,
JSValue res;
res = JS_NewBigFloat(ctx);
- if (JS_IsException(res)) {
- JS_FreeValue(ctx, op1);
- JS_FreeValue(ctx, op2);
- return -1;
- }
+ if (JS_IsException(res))
+ goto fail;
r = JS_GetBigFloat(res);
a = JS_ToBigFloat(ctx, &a_s, op1);
+ if (!a) {
+ JS_FreeValue(ctx, res);
+ goto fail;
+ }
b = JS_ToBigFloat(ctx, &b_s, op2);
+ if (!b) {
+ if (a == &a_s)
+ bf_delete(a);
+ JS_FreeValue(ctx, res);
+ goto fail;
+ }
bf_init(ctx->bf_ctx, r);
switch(op) {
case OP_add:
@@ -13219,6 +13251,10 @@ static int js_binary_arith_bigfloat(JSContext *ctx, OPCodeEnum op,
}
*pres = res;
return 0;
+ fail:
+ JS_FreeValue(ctx, op1);
+ JS_FreeValue(ctx, op2);
+ return -1;
}
/* b must be a positive integer */
@@ -13765,8 +13801,8 @@ static int js_compare_bigdecimal(JSContext *ctx, OPCodeEnum op,
JS_FreeValue(ctx, op1);
return -1;
}
- a = JS_ToBigDecimal(ctx, op1);
- b = JS_ToBigDecimal(ctx, op2);
+ a = JS_ToBigDecimal(ctx, op1); /* cannot fail */
+ b = JS_ToBigDecimal(ctx, op2); /* cannot fail */
switch(op) {
case OP_lt:
@@ -14204,8 +14240,10 @@ static no_inline int js_mul_pow10(JSContext *ctx, JSValue *sp)
op1 = sp[-2];
op2 = sp[-1];
a = JS_ToBigFloat(ctx, &a_s, op1);
- if (!a)
+ if (!a) {
+ JS_FreeValue(ctx, res);
return -1;
+ }
if (JS_IsBigInt(ctx, op2)) {
ret = JS_ToBigInt64(ctx, &e, op2);
} else {
@@ -14327,8 +14365,8 @@ static BOOL js_strict_eq2(JSContext *ctx, JSValue op1, JSValue op2,
res = FALSE;
break;
}
- a = JS_ToBigFloat(ctx, &a_s, op1);
- b = JS_ToBigFloat(ctx, &b_s, op2);
+ a = JS_ToBigFloat(ctx, &a_s, op1); /* cannot fail */
+ b = JS_ToBigFloat(ctx, &b_s, op2); /* cannot fail */
res = bf_cmp_eq(a, b);
if (a == &a_s)
bf_delete(a);
@@ -49056,6 +49094,10 @@ static JSValue JS_ToBigIntCtorFree(JSContext *ctx, JSValue val)
bf_t *a, a_s;
a = JS_ToBigFloat(ctx, &a_s, val);
+ if (!a) {
+ JS_FreeValue(ctx, val);
+ return JS_EXCEPTION;
+ }
if (!bf_is_finite(a)) {
JS_FreeValue(ctx, val);
val = JS_ThrowRangeError(ctx, "cannot convert NaN or Infinity to bigint");
@@ -49857,6 +49899,10 @@ static JSValue js_bigfloat_fop(JSContext *ctx, JSValueConst this_val,
if (JS_IsException(op1))
return op1;
a = JS_ToBigFloat(ctx, &a_s, op1);
+ if (!a) {
+ JS_FreeValue(ctx, op1);
+ return JS_EXCEPTION;
+ }
fe = &ctx->fp_env;
if (argc > 1) {
fe = JS_GetOpaque2(ctx, argv[1], JS_CLASS_FLOAT_ENV);
@@ -49955,7 +50001,11 @@ static JSValue js_bigfloat_fop2(JSContext *ctx, JSValueConst this_val,
return op2;
}
a = JS_ToBigFloat(ctx, &a_s, op1);
+ if (!a)
+ goto fail1;
b = JS_ToBigFloat(ctx, &b_s, op2);
+ if (!b)
+ goto fail2;
fe = &ctx->fp_env;
if (argc > 2) {
fe = JS_GetOpaque2(ctx, argv[2], JS_CLASS_FLOAT_ENV);
@@ -49965,10 +50015,12 @@ static JSValue js_bigfloat_fop2(JSContext *ctx, JSValueConst this_val,
res = JS_NewBigFloat(ctx);
if (JS_IsException(res)) {
fail:
- if (a == &a_s)
- bf_delete(a);
if (b == &b_s)
bf_delete(b);
+ fail2:
+ if (a == &a_s)
+ bf_delete(a);
+ fail1:
JS_FreeValue(ctx, op1);
JS_FreeValue(ctx, op2);
return JS_EXCEPTION;