diff options
author | itchyny <itchyny@cybozu.co.jp> | 2023-08-13 12:06:16 +0900 |
---|---|---|
committer | Emanuele Torre <torreemanuele6@gmail.com> | 2023-08-13 14:17:25 +0200 |
commit | 3fa10e8cc197390392f5f5f6e0c9e2fcd5590530 (patch) | |
tree | 5147c50e6bda43d4d68e0f3fe5c17d7e748427da | |
parent | f86566b2631b777c0d0c9a4572eb21146a14829b (diff) |
Fix crash on numeric comparison again (ref #2825)
The decNumber library subtracts the exponents of two numbers,
we make sure to limit the number of digits not to make it overflows.
Since the maximum adjusted exponent is `emax` and the minimum is
`emin - digits + 1`, we follow `emax - (emin - digits + 1) <= INT32_MAX`.
-rw-r--r-- | src/jv.c | 2 | ||||
-rw-r--r-- | tests/jq.test | 18 |
2 files changed, 18 insertions, 2 deletions
@@ -528,7 +528,7 @@ static decContext* tsd_dec_ctx_get(pthread_key_t *key) { if (key == &dec_ctx_key) { decContextDefault(ctx, DEC_INIT_BASE); - ctx->digits = DEC_MAX_DIGITS - 1; + ctx->digits = INT32_MAX - (ctx->emax - ctx->emin - 1); ctx->traps = 0; /*no errors*/ } else if (key == &dec_ctx_dbl_key) diff --git a/tests/jq.test b/tests/jq.test index eff15e00..de38e4de 100644 --- a/tests/jq.test +++ b/tests/jq.test @@ -556,8 +556,24 @@ null null 1e+17 -5E500000000>5E-5000000000 +9E999999999, 9999999999E999999990, 1E-999999999, 0.000000001E-999999990 null +9E+999999999 +9.999999999E+999999999 +1E-999999999 +1E-999999999 + +5E500000000 > 5E-5000000000, 10000E500000000 > 10000E-5000000000 +null +true +true + +# #2825 +(1e999999999, 10e999999999) > (1e-1147483648, 0.1e-1147483648) +null +true +true +true true 25 % 7 |