Skip to content

Commit

Permalink
check-qjson qmp-test: Cover control characters more thoroughly
Browse files Browse the repository at this point in the history
RFC 8259 "The JavaScript Object Notation (JSON) Data Interchange
Format" requires control characters in strings to be escaped.
Demonstrate the JSON parser accepts U+0001 .. U+001F unescaped.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-Id: <20180823164025.12553-16-armbru@redhat.com>
  • Loading branch information
Markus Armbruster committed Aug 24, 2018
1 parent 5f454e6 commit 6bc93a3
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 6 deletions.
36 changes: 30 additions & 6 deletions tests/check-qjson.c
Expand Up @@ -192,6 +192,26 @@ static void utf8_string(void)
* We may choose to define this as feature
*/

/* 0 Control characters */
{
/*
* Note: \x00 is impossible, other representations of
* U+0000 are covered under 4.3
*/
"\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",
/* 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",
"\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007"
"\\b\\t\\n\\u000B\\f\\r\\u000E\\u000F"
"\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017"
"\\u0018\\u0019\\u001A\\u001B\\u001C\\u001D\\u001E\\u001F",
},
/* 1 Some correct UTF-8 text */
{
/* a bit of German */
Expand All @@ -211,14 +231,14 @@ static void utf8_string(void)
/* 2 Boundary condition test cases */
/* 2.1 First possible sequence of a certain length */
/*
* 2.1.1 1 byte U+0001
* \x00 is impossible, test \x01 instead. Other
* representations of U+0000 are covered under 4.3.
* 2.1.1 1 byte U+0020
* Control characters are already covered by their own test
* case under 0. Test the first 1 byte non-control character
* here.
*/
{
"\x01",
"\x01",
"\\u0001",
" ",
" ",
},
/* 2.1.2 2 bytes U+0080 */
{
Expand Down Expand Up @@ -1333,6 +1353,10 @@ static void junk_input(void)
g_assert(!err); /* BUG */
g_assert(obj == NULL);

obj = qobject_from_json("{\x01", &err);
g_assert(!err); /* BUG */
g_assert(obj == NULL);

obj = qobject_from_json("[0\xFF]", &err);
error_free_or_abort(&err);
g_assert(obj == NULL);
Expand Down
14 changes: 14 additions & 0 deletions tests/qmp-test.c
Expand Up @@ -71,13 +71,27 @@ static void test_malformed(QTestState *qts)
qobject_unref(resp);
g_assert(recovered(qts));

/* lexical error: funny control character outside string */
qtest_qmp_send_raw(qts, "{\x01");
resp = qtest_qmp_receive(qts);
g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
qobject_unref(resp);
g_assert(recovered(qts));

/* lexical error: impossible byte in string */
qtest_qmp_send_raw(qts, "{'bad \xFF");
resp = qtest_qmp_receive(qts);
g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
qobject_unref(resp);
g_assert(recovered(qts));

/* lexical error: control character in string */
qtest_qmp_send_raw(qts, "{'execute': 'nonexistent', 'id':'\n'}");
resp = qtest_qmp_receive(qts);
g_assert_cmpstr(get_error_class(resp), ==, "CommandNotFound"); /* BUG */
qobject_unref(resp);
g_assert(recovered(qts));

/* lexical error: interpolation */
qtest_qmp_send_raw(qts, "%%p\n");
resp = qtest_qmp_receive(qts);
Expand Down

0 comments on commit 6bc93a3

Please sign in to comment.