--- src/util/virjson.c | 9 ++++++++- tests/jsontest.c | 5 +++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/util/virjson.c b/src/util/virjson.c index 2bb7324..f0a06ab 100644 --- a/src/util/virjson.c +++ b/src/util/virjson.c @@ -1004,7 +1004,14 @@ virJSONValuePtr virJSONValueFromString(const char *jsonstring) goto cleanup; } - ret = parser.head; + if (parser.nstate != 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("cannot parse json %s: unterminated string/map/array"), + jsonstring); + virJSONValueFree(parser.head); + } else { + ret = parser.head; + } cleanup: yajl_free(hand); diff --git a/tests/jsontest.c b/tests/jsontest.c index 808a2ea..e806b6f 100644 --- a/tests/jsontest.c +++ b/tests/jsontest.c @@ -197,9 +197,14 @@ mymain(void) DO_TEST_PARSE_FAIL("number with garbage", "2345b45"); DO_TEST_PARSE_FAIL("float with garbage", "0.0314159ee+100"); DO_TEST_PARSE_FAIL("unterminated string", "\"The meaning of lif"); + DO_TEST_PARSE_FAIL("unterminated array", "[ 1, 2, 3"); 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"); + DO_TEST_PARSE_FAIL("unterminated array of objects", + "[ {\"name\": \"John\"}, {\"name\": \"Paul\"}, "); 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 }"); return (ret == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } -- 1.8.1.5 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list