mirror of
				https://github.com/eledio-devices/thirdparty-ArduinoJson.git
				synced 2025-10-31 16:14:11 +01:00 
			
		
		
		
	Fixed JsonBuffer::parse() nesting limit (fixes #693)
				
					
				
			This commit is contained in:
		| @@ -5,44 +5,62 @@ | ||||
| #include <ArduinoJson.h> | ||||
| #include <catch.hpp> | ||||
|  | ||||
| bool tryParseArray(const char *json, uint8_t nestingLimit) { | ||||
|   DynamicJsonBuffer buffer; | ||||
|   return buffer.parseArray(json, nestingLimit).success(); | ||||
| } | ||||
|  | ||||
| bool tryParseObject(const char *json, uint8_t nestingLimit) { | ||||
|   DynamicJsonBuffer buffer; | ||||
|   return buffer.parseObject(json, nestingLimit).success(); | ||||
| } | ||||
| #define SHOULD_WORK(expression) REQUIRE(true == expression.success()); | ||||
| #define SHOULD_FAIL(expression) REQUIRE(false == expression.success()); | ||||
|  | ||||
| TEST_CASE("JsonParser nestingLimit") { | ||||
|   SECTION("ParseArrayWithNestingLimit0") { | ||||
|     REQUIRE(true == tryParseArray("[]", 0)); | ||||
|     REQUIRE(false == tryParseArray("[[]]", 0)); | ||||
|   DynamicJsonBuffer jb; | ||||
|  | ||||
|   SECTION("parseArray()") { | ||||
|     SECTION("limit = 0") { | ||||
|       SHOULD_FAIL(jb.parseArray("[]", 0)); | ||||
|     } | ||||
|  | ||||
|     SECTION("limit = 1") { | ||||
|       SHOULD_WORK(jb.parseArray("[]", 1)); | ||||
|       SHOULD_FAIL(jb.parseArray("[[]]", 1)); | ||||
|     } | ||||
|  | ||||
|     SECTION("limit = 2") { | ||||
|       SHOULD_WORK(jb.parseArray("[[]]", 2)); | ||||
|       SHOULD_FAIL(jb.parseArray("[[[]]]", 2)); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   SECTION("ParseArrayWithNestingLimit1") { | ||||
|     REQUIRE(true == tryParseArray("[[]]", 1)); | ||||
|     REQUIRE(false == tryParseArray("[[[]]]", 1)); | ||||
|   SECTION("parseObject()") { | ||||
|     SECTION("limit = 0") { | ||||
|       SHOULD_FAIL(jb.parseObject("{}", 0)); | ||||
|     } | ||||
|  | ||||
|     SECTION("limit = 1") { | ||||
|       SHOULD_WORK(jb.parseObject("{\"key\":42}", 1)); | ||||
|       SHOULD_FAIL(jb.parseObject("{\"key\":{\"key\":42}}", 1)); | ||||
|     } | ||||
|  | ||||
|     SECTION("limit = 2") { | ||||
|       SHOULD_WORK(jb.parseObject("{\"key\":{\"key\":42}}", 2)); | ||||
|       SHOULD_FAIL(jb.parseObject("{\"key\":{\"key\":{\"key\":42}}}", 2)); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   SECTION("ParseArrayWithNestingLimit2") { | ||||
|     REQUIRE(true == tryParseArray("[[[]]]", 2)); | ||||
|     REQUIRE(false == tryParseArray("[[[[]]]]", 2)); | ||||
|   } | ||||
|   SECTION("parse()") { | ||||
|     SECTION("limit = 0") { | ||||
|       SHOULD_WORK(jb.parse("\"toto\"", 0)); | ||||
|       SHOULD_WORK(jb.parse("123", 0)); | ||||
|       SHOULD_WORK(jb.parse("true", 0)); | ||||
|       SHOULD_FAIL(jb.parse("[]", 0)); | ||||
|       SHOULD_FAIL(jb.parse("{}", 0)); | ||||
|       SHOULD_FAIL(jb.parse("[\"toto\"]", 0)); | ||||
|       SHOULD_FAIL(jb.parse("{\"toto\":1}", 0)); | ||||
|     } | ||||
|  | ||||
|   SECTION("ParseObjectWithNestingLimit0") { | ||||
|     REQUIRE(true == tryParseObject("{}", 0)); | ||||
|     REQUIRE(false == tryParseObject("{\"key\":{}}", 0)); | ||||
|   } | ||||
|  | ||||
|   SECTION("ParseObjectWithNestingLimit1") { | ||||
|     REQUIRE(true == tryParseObject("{\"key\":{}}", 1)); | ||||
|     REQUIRE(false == tryParseObject("{\"key\":{\"key\":{}}}", 1)); | ||||
|   } | ||||
|  | ||||
|   SECTION("ParseObjectWithNestingLimit2") { | ||||
|     REQUIRE(true == tryParseObject("{\"key\":{\"key\":{}}}", 2)); | ||||
|     REQUIRE(false == tryParseObject("{\"key\":{\"key\":{\"key\":{}}}}", 2)); | ||||
|     SECTION("limit = 1") { | ||||
|       SHOULD_WORK(jb.parse("[\"toto\"]", 1)); | ||||
|       SHOULD_WORK(jb.parse("{\"toto\":1}", 1)); | ||||
|       SHOULD_FAIL(jb.parse("{\"toto\":{}}", 1)); | ||||
|       SHOULD_FAIL(jb.parse("{\"toto\":[]}", 1)); | ||||
|       SHOULD_FAIL(jb.parse("[[\"toto\"]]", 1)); | ||||
|       SHOULD_FAIL(jb.parse("[{\"toto\":1}]", 1)); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user