We already enable the parser option to detect invalid UTF-8, but
didn't test it. Also, JSON states that behavior of an object
with a duplicated key is undefined; we chose to reject it, but
were not testing it.
With the enhanced tests in place, we can simplify yajl2
initialization by relying on parser defaults being sane.
* src/util/virjson.c (virJSONValueFromString): Simplify.
* tests/jsontest.c (mymain): Test more bad usage.
Signed-off-by: Eric Blake <eblake(a)redhat.com>
---
src/util/virjson.c | 6 +-----
tests/jsontest.c | 2 ++
2 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/src/util/virjson.c b/src/util/virjson.c
index 3c6ed34..c123943 100644
--- a/src/util/virjson.c
+++ b/src/util/virjson.c
@@ -1597,7 +1597,7 @@ virJSONValueFromString(const char *jsonstring)
int rc;
size_t len = strlen(jsonstring);
# ifndef WITH_YAJL2
- yajl_parser_config cfg = { 0, 1 };
+ yajl_parser_config cfg = { 0, 1 }; /* Match yajl 2 default behavior */
virJSONValuePtr tmp;
# endif
@@ -1605,10 +1605,6 @@ virJSONValueFromString(const char *jsonstring)
# ifdef WITH_YAJL2
hand = yajl_alloc(&parserCallbacks, NULL, &parser);
- if (hand) {
- yajl_config(hand, yajl_allow_comments, 0);
- yajl_config(hand, yajl_dont_validate_strings, 0);
- }
# else
hand = yajl_alloc(&parserCallbacks, &cfg, NULL, &parser);
# endif
diff --git a/tests/jsontest.c b/tests/jsontest.c
index 97b9c0a..223f867 100644
--- a/tests/jsontest.c
+++ b/tests/jsontest.c
@@ -422,6 +422,7 @@ mymain(void)
DO_TEST_PARSE_FAIL("trailing garbage", "[] []");
DO_TEST_PARSE_FAIL("list without array", "1, 1");
DO_TEST_PARSE_FAIL("parser abuse", "1] [2");
+ DO_TEST_PARSE_FAIL("invalid UTF-8", "\"\x80\"");
DO_TEST_PARSE_FAIL("object with numeric keys", "{ 1:1, 2:1, 3:2
}");
DO_TEST_PARSE_FAIL("unterminated object", "{ \"1\":1,
\"2\":1, \"3\":2");
@@ -430,6 +431,7 @@ mymain(void)
DO_TEST_PARSE_FAIL("array of an object with an array as a key",
"[ {[\"key1\", \"key2\"]:
\"value\"} ]");
DO_TEST_PARSE_FAIL("object with unterminated key", "{ \"key:7
}");
+ DO_TEST_PARSE_FAIL("duplicate key", "{ \"a\": 1,
\"a\": 1 }");
DO_TEST_FULL("lookup on array", Lookup,
"[ 1 ]", NULL, false);
--
2.4.3