Skip to content

Commit ecf3d64

Browse files
StilesCrisisStilesCrisis
authored andcommitted
Merge branch 'nan-inf-parse-fix' into token-by-token-parsing
2 parents bd4c282 + 5e785d3 commit ecf3d64

File tree

2 files changed

+22
-9
lines changed

2 files changed

+22
-9
lines changed

include/rapidjson/reader.h

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1247,18 +1247,27 @@ class GenericReader {
12471247
}
12481248
// Parse NaN or Infinity here
12491249
else if ((parseFlags & kParseNanAndInfFlag) && RAPIDJSON_LIKELY((s.Peek() == 'I' || s.Peek() == 'N'))) {
1250-
useNanOrInf = true;
1251-
if (RAPIDJSON_LIKELY(Consume(s, 'N') && Consume(s, 'a') && Consume(s, 'N'))) {
1252-
d = std::numeric_limits<double>::quiet_NaN();
1250+
if (Consume(s, 'N')) {
1251+
if (Consume(s, 'a') && Consume(s, 'N')) {
1252+
d = std::numeric_limits<double>::quiet_NaN();
1253+
useNanOrInf = true;
1254+
}
12531255
}
1254-
else if (RAPIDJSON_LIKELY(Consume(s, 'I') && Consume(s, 'n') && Consume(s, 'f'))) {
1255-
d = (minus ? -std::numeric_limits<double>::infinity() : std::numeric_limits<double>::infinity());
1256-
if (RAPIDJSON_UNLIKELY(s.Peek() == 'i' && !(Consume(s, 'i') && Consume(s, 'n')
1257-
&& Consume(s, 'i') && Consume(s, 't') && Consume(s, 'y'))))
1258-
RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell());
1256+
else if (RAPIDJSON_LIKELY(Consume(s, 'I'))) {
1257+
if (Consume(s, 'n') && Consume(s, 'f')) {
1258+
d = (minus ? -std::numeric_limits<double>::infinity() : std::numeric_limits<double>::infinity());
1259+
useNanOrInf = true;
1260+
1261+
if (RAPIDJSON_UNLIKELY(s.Peek() == 'i' && !(Consume(s, 'i') && Consume(s, 'n')
1262+
&& Consume(s, 'i') && Consume(s, 't') && Consume(s, 'y')))) {
1263+
RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell());
1264+
}
1265+
}
12591266
}
1260-
else
1267+
1268+
if (RAPIDJSON_UNLIKELY(!useNanOrInf)) {
12611269
RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell());
1270+
}
12621271
}
12631272
else
12641273
RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell());

test/unittest/readertest.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1877,6 +1877,10 @@ TEST(Reader, ParseNanAndInfinity) {
18771877
TEST_NAN_INF("Infinity", inf);
18781878
TEST_NAN_INF("-Inf", -inf);
18791879
TEST_NAN_INF("-Infinity", -inf);
1880+
TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NInf", 1);
1881+
TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NaInf", 2);
1882+
TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "INan", 1);
1883+
TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "InNan", 2);
18801884
TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "nan", 1);
18811885
TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "-nan", 1);
18821886
TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NAN", 1);

0 commit comments

Comments
 (0)