mirror of
				https://github.com/Tencent/rapidjson.git
				synced 2025-10-27 19:10:24 +01:00 
			
		
		
		
	Fix parsing of NaN/Inf
A failed half-consume of “NaN” now returns “value invalid” instead of attempting to consume an “Inf”.
This commit is contained in:
		| @@ -1170,18 +1170,27 @@ private: | |||||||
|         } |         } | ||||||
|         // Parse NaN or Infinity here |         // Parse NaN or Infinity here | ||||||
|         else if ((parseFlags & kParseNanAndInfFlag) && RAPIDJSON_LIKELY((s.Peek() == 'I' || s.Peek() == 'N'))) { |         else if ((parseFlags & kParseNanAndInfFlag) && RAPIDJSON_LIKELY((s.Peek() == 'I' || s.Peek() == 'N'))) { | ||||||
|             useNanOrInf = true; |             if (Consume(s, 'N')) { | ||||||
|             if (RAPIDJSON_LIKELY(Consume(s, 'N') && Consume(s, 'a') && Consume(s, 'N'))) { |                 if (Consume(s, 'a') && Consume(s, 'N')) { | ||||||
|                 d = std::numeric_limits<double>::quiet_NaN(); |                     d = std::numeric_limits<double>::quiet_NaN(); | ||||||
|  |                     useNanOrInf = true; | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|             else if (RAPIDJSON_LIKELY(Consume(s, 'I') && Consume(s, 'n') && Consume(s, 'f'))) { |             else if (RAPIDJSON_LIKELY(Consume(s, 'I'))) { | ||||||
|                 d = (minus ? -std::numeric_limits<double>::infinity() : std::numeric_limits<double>::infinity()); |                 if (Consume(s, 'n') && Consume(s, 'f')) { | ||||||
|                 if (RAPIDJSON_UNLIKELY(s.Peek() == 'i' && !(Consume(s, 'i') && Consume(s, 'n') |                     d = (minus ? -std::numeric_limits<double>::infinity() : std::numeric_limits<double>::infinity()); | ||||||
|                                                             && Consume(s, 'i') && Consume(s, 't') && Consume(s, 'y')))) |                     useNanOrInf = true; | ||||||
|                     RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); |  | ||||||
|  |                     if (RAPIDJSON_UNLIKELY(s.Peek() == 'i' && !(Consume(s, 'i') && Consume(s, 'n') | ||||||
|  |                                                                 && Consume(s, 'i') && Consume(s, 't') && Consume(s, 'y')))) { | ||||||
|  |                         RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|             else |              | ||||||
|  |             if (RAPIDJSON_UNLIKELY(!useNanOrInf)) { | ||||||
|                 RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); |                 RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|         else |         else | ||||||
|             RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); |             RAPIDJSON_PARSE_ERROR(kParseErrorValueInvalid, s.Tell()); | ||||||
|   | |||||||
| @@ -1833,9 +1833,9 @@ TEST(Reader, ParseNanAndInfinity) { | |||||||
|     TEST_NAN_INF("-Inf", -inf); |     TEST_NAN_INF("-Inf", -inf); | ||||||
|     TEST_NAN_INF("-Infinity", -inf); |     TEST_NAN_INF("-Infinity", -inf); | ||||||
|     TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NInf", 1); |     TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NInf", 1); | ||||||
|     TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NaInf", 1); |     TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NaInf", 2); | ||||||
|     TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "INan", 1); |     TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "INan", 1); | ||||||
|     TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "InNan", 1); |     TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "InNan", 2); | ||||||
|     TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "nan", 1); |     TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "nan", 1); | ||||||
|     TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "-nan", 1); |     TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "-nan", 1); | ||||||
|     TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NAN", 1); |     TEST_NAN_INF_ERROR(kParseErrorValueInvalid, "NAN", 1); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 StilesCrisis
					StilesCrisis