exponent = 0;
do {
if (exponent >= INT_MAX / 10) {
- json_error(p, "exponent outside valid range");
- return;
+ goto bad_exponent;
}
exponent = exponent * 10 + (*cp - '0');
cp++;
} while (isdigit((unsigned char) *cp));
if (negative_exponent) {
+ if (pow10 < INT_MIN + exponent) {
+ goto bad_exponent;
+ }
pow10 -= exponent;
} else {
+ if (pow10 > INT_MAX - exponent) {
+ goto bad_exponent;
+ }
pow10 += exponent;
}
}
token.real = 0;
}
json_parser_input(p, &token);
+ return;
+
+bad_exponent:
+ json_error(p, "exponent outside valid range");
}
static const char *
[1e9999 is too big],
[[[1e9999]]],
[error: number outside valid range])
-JSON_CHECK_NEGATIVE(
+JSON_CHECK_NEGATIVE_C(
[exponent bigger than INT_MAX],
[[[1e9999999999999999999]]],
[error: exponent outside valid range])
+JSON_CHECK_NEGATIVE_C(
+ [exponent smaller than INT_MIN],
+ [[[1e-9999999999999999999]]],
+ [error: exponent outside valid range])
+JSON_CHECK_NEGATIVE_C(
+ [accumulated exponent bigger than INT_MAX],
+ [[[340282366920938463461761716499e2147483647]]],
+ [error: exponent outside valid range])
+JSON_CHECK_NEGATIVE_C(
+ [accumulated exponent smaller than INT_MIN],
+ [[[0.340282366920938463461761716499e-2147483648]]],
+ [error: exponent outside valid range])
JSON_CHECK_NEGATIVE(
[decimal point must be followed by digit],
[[[1.]]],