static double
njs_strtod_internal(const u_char *start, size_t length, int exp)
{
+ int shift;
size_t left, right;
const u_char *p, *e, *b;
return 0.0;
}
- exp += (int) (left - right);
+ shift = (int) (left - right);
- if (exp + (int) length - 1 >= NJS_DECIMAL_POWER_MAX) {
+ if (exp >= NJS_DECIMAL_POWER_MAX - shift - (int) length + 1) {
return INFINITY;
}
- if (exp + (int) length <= NJS_DECIMAL_POWER_MIN) {
+ if (exp <= NJS_DECIMAL_POWER_MIN - shift - (int) length) {
return 0.0;
}
- return njs_diyfp_strtod(start, length, exp);
+ return njs_diyfp_strtod(start, length, exp + shift);
}
break;
}
- exp = exp * 10 + c;
+ if (exp < (INT_MAX - 9) / 10) {
+ exp = exp * 10 + c;
+ }
}
exponent += minus ? -exp : exp;
{ njs_str("parseFloat('12345abc')"),
njs_str("12345") },
+ { njs_str("parseFloat('1e2147483647')"),
+ njs_str("Infinity") },
+
+ { njs_str("parseFloat('1e-2147483647')"),
+ njs_str("0") },
+
+ { njs_str("parseFloat('1e-2147483648')"),
+ njs_str("0") },
+
+ { njs_str("parseFloat('1e' + '5'.repeat(16))"),
+ njs_str("Infinity") },
+
+ { njs_str("parseFloat('1e-' + '5'.repeat(16))"),
+ njs_str("0") },
+
{ njs_str("parseFloat('0x')"),
njs_str("0") },