[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 17/60] json: Reject unescaped control characters
From: |
Markus Armbruster |
Subject: |
[Qemu-devel] [PATCH v2 17/60] json: Reject unescaped control characters |
Date: |
Fri, 17 Aug 2018 17:05:16 +0200 |
Fix the lexer to reject unescaped control characters in JSON strings,
in accordance with RFC 7159.
Bonus: we now recover more nicely from unclosed strings. E.g.
{"one: 1}\n{"two": 2}
now recovers cleanly after the newline, where before the lexer
remained confused until the next unpaired double quote or lexical
error.
Signed-off-by: Markus Armbruster <address@hidden>
Reviewed-by: Eric Blake <address@hidden>
---
qobject/json-lexer.c | 4 ++--
tests/check-qjson.c | 6 +-----
tests/qmp-test.c | 4 ++--
3 files changed, 5 insertions(+), 9 deletions(-)
diff --git a/qobject/json-lexer.c b/qobject/json-lexer.c
index 7c0875d225..e85e9a78ff 100644
--- a/qobject/json-lexer.c
+++ b/qobject/json-lexer.c
@@ -115,7 +115,7 @@ static const uint8_t json_lexer[][256] = {
['u'] = IN_DQ_UCODE0,
},
[IN_DQ_STRING] = {
- [1 ... 0xBF] = IN_DQ_STRING,
+ [0x20 ... 0xBF] = IN_DQ_STRING,
[0xC2 ... 0xF4] = IN_DQ_STRING,
['\\'] = IN_DQ_STRING_ESCAPE,
['"'] = JSON_STRING,
@@ -155,7 +155,7 @@ static const uint8_t json_lexer[][256] = {
['u'] = IN_SQ_UCODE0,
},
[IN_SQ_STRING] = {
- [1 ... 0xBF] = IN_SQ_STRING,
+ [0x20 ... 0xBF] = IN_SQ_STRING,
[0xC2 ... 0xF4] = IN_SQ_STRING,
['\\'] = IN_SQ_STRING_ESCAPE,
['\''] = JSON_STRING,
diff --git a/tests/check-qjson.c b/tests/check-qjson.c
index 4fb43e4d5d..dd6bb76ec5 100644
--- a/tests/check-qjson.c
+++ b/tests/check-qjson.c
@@ -202,11 +202,7 @@ static void utf8_string(void)
"\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F"
"\x10\x11\x12\x13\x14\x15\x16\x17"
"\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F",
- /* bug: not corrected (valid UTF-8, but invalid JSON) */
- "\x01\x02\x03\x04\x05\x06\x07"
- "\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F"
- "\x10\x11\x12\x13\x14\x15\x16\x17"
- "\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F",
+ NULL,
"\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007"
"\\b\\t\\n\\u000B\\f\\r\\u000E\\u000F"
"\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017"
diff --git a/tests/qmp-test.c b/tests/qmp-test.c
index 5edc97f63f..7b3ba17c4a 100644
--- a/tests/qmp-test.c
+++ b/tests/qmp-test.c
@@ -86,9 +86,9 @@ static void test_malformed(QTestState *qts)
g_assert(recovered(qts));
/* lexical error: control character in string */
- qtest_qmp_send_raw(qts, "{'execute': 'nonexistent', 'id':'\n'}");
+ qtest_qmp_send_raw(qts, "{'execute': 'nonexistent', 'id':'\n");
resp = qtest_qmp_receive(qts);
- g_assert_cmpstr(get_error_class(resp), ==, "CommandNotFound"); /* BUG */
+ g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
qobject_unref(resp);
g_assert(recovered(qts));
--
2.17.1
- Re: [Qemu-devel] [PATCH v2 07/60] check-qjson: Cover escaped characters more thoroughly, part 1, (continued)
- [Qemu-devel] [PATCH v2 01/60] check-qjson: Cover multiple JSON objects in same string, Markus Armbruster, 2018/08/17
- [Qemu-devel] [PATCH v2 10/60] check-qjson: Consolidate partly redundant string tests, Markus Armbruster, 2018/08/17
- [Qemu-devel] [PATCH v2 19/60] json: Tighten and simplify qstring_from_escaped_str()'s loop, Markus Armbruster, 2018/08/17
- [Qemu-devel] [PATCH v2 22/60] json: Report first rather than last parse error, Markus Armbruster, 2018/08/17
- [Qemu-devel] [PATCH v2 31/60] json-parser: simplify and avoid JSONParserContext allocation, Markus Armbruster, 2018/08/17
- [Qemu-devel] [PATCH v2 15/60] check-qjson: Cover interpolation more thoroughly, Markus Armbruster, 2018/08/17
- [Qemu-devel] [PATCH v2 17/60] json: Reject unescaped control characters,
Markus Armbruster <=
- [Qemu-devel] [PATCH v2 16/60] json: Fix lexer to include the bad character in JSON_ERROR token, Markus Armbruster, 2018/08/17
- [Qemu-devel] [PATCH v2 12/60] check-qjson: Simplify utf8_string(), Markus Armbruster, 2018/08/17
- [Qemu-devel] [PATCH v2 08/60] check-qjson: Streamline escaped_string()'s test strings, Markus Armbruster, 2018/08/17
- [Qemu-devel] [PATCH v2 02/60] check-qjson: Cover blank and lexically erroneous input, Markus Armbruster, 2018/08/17
- [Qemu-devel] [PATCH v2 06/60] test-qga: Clean up how we test QGA synchronization, Markus Armbruster, 2018/08/17
- [Qemu-devel] [PATCH v2 04/60] qmp-cmd-test: Split off qmp-test, Markus Armbruster, 2018/08/17
- [Qemu-devel] [PATCH v2 05/60] qmp-test: Cover syntax and lexical errors, Markus Armbruster, 2018/08/17