check-qjson: Fix utf8_string() to test all invalid sequences
Some of utf8_string()'s test_cases[] contain multiple invalid sequences. Testing that qobject_from_json() fails only tests we reject at least one invalid sequence. That's incomplete. Additionally test each non-space sequence in isolation. This demonstrates that the JSON parser accepts invalid sequences starting with \xC2..\xF4. Add a FIXME comment. Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Message-Id: <20180823164025.12553-15-armbru@redhat.com>
This commit is contained in:
parent
32846e9304
commit
5f454e662e
|
@ -20,6 +20,7 @@
|
||||||
#include "qapi/qmp/qnull.h"
|
#include "qapi/qmp/qnull.h"
|
||||||
#include "qapi/qmp/qnum.h"
|
#include "qapi/qmp/qnum.h"
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/qstring.h"
|
||||||
|
#include "qemu/unicode.h"
|
||||||
#include "qemu-common.h"
|
#include "qemu-common.h"
|
||||||
|
|
||||||
static QString *from_json_str(const char *jstr, bool single, Error **errp)
|
static QString *from_json_str(const char *jstr, bool single, Error **errp)
|
||||||
|
@ -410,7 +411,7 @@ static void utf8_string(void)
|
||||||
"\xC8 \xC9 \xCA \xCB \xCC \xCD \xCE \xCF "
|
"\xC8 \xC9 \xCA \xCB \xCC \xCD \xCE \xCF "
|
||||||
"\xD0 \xD1 \xD2 \xD3 \xD4 \xD5 \xD6 \xD7 "
|
"\xD0 \xD1 \xD2 \xD3 \xD4 \xD5 \xD6 \xD7 "
|
||||||
"\xD8 \xD9 \xDA \xDB \xDC \xDD \xDE \xDF ",
|
"\xD8 \xD9 \xDA \xDB \xDC \xDD \xDE \xDF ",
|
||||||
NULL, /* bug: rejected */
|
NULL, /* bug: rejected (partly, see FIXME below) */
|
||||||
"\\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD "
|
"\\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD "
|
||||||
"\\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD "
|
"\\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD "
|
||||||
"\\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD "
|
"\\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD "
|
||||||
|
@ -429,7 +430,7 @@ static void utf8_string(void)
|
||||||
/* 3.2.3 All 8 first bytes of 4-byte sequences, followed by space */
|
/* 3.2.3 All 8 first bytes of 4-byte sequences, followed by space */
|
||||||
{
|
{
|
||||||
"\xF0 \xF1 \xF2 \xF3 \xF4 \xF5 \xF6 \xF7 ",
|
"\xF0 \xF1 \xF2 \xF3 \xF4 \xF5 \xF6 \xF7 ",
|
||||||
NULL, /* bug: rejected */
|
NULL, /* bug: rejected (partly, see FIXME below) */
|
||||||
"\\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD ",
|
"\\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD \\uFFFD ",
|
||||||
},
|
},
|
||||||
/* 3.2.4 All 4 first bytes of 5-byte sequences, followed by space */
|
/* 3.2.4 All 4 first bytes of 5-byte sequences, followed by space */
|
||||||
|
@ -509,7 +510,7 @@ static void utf8_string(void)
|
||||||
{
|
{
|
||||||
"\xC0\xE0\x80\xF0\x80\x80\xF8\x80\x80\x80\xFC\x80\x80\x80\x80"
|
"\xC0\xE0\x80\xF0\x80\x80\xF8\x80\x80\x80\xFC\x80\x80\x80\x80"
|
||||||
"\xDF\xEF\xBF\xF7\xBF\xBF\xFB\xBF\xBF\xBF\xFD\xBF\xBF\xBF\xBF",
|
"\xDF\xEF\xBF\xF7\xBF\xBF\xFB\xBF\xBF\xBF\xFD\xBF\xBF\xBF\xBF",
|
||||||
NULL, /* bug: rejected */
|
NULL, /* bug: rejected (partly, see FIXME below) */
|
||||||
"\\uFFFD\\uFFFD\\uFFFD\\uFFFD\\uFFFD"
|
"\\uFFFD\\uFFFD\\uFFFD\\uFFFD\\uFFFD"
|
||||||
"\\uFFFD\\uFFFD\\uFFFD\\uFFFD\\uFFFD",
|
"\\uFFFD\\uFFFD\\uFFFD\\uFFFD\\uFFFD",
|
||||||
},
|
},
|
||||||
|
@ -792,8 +793,8 @@ static void utf8_string(void)
|
||||||
};
|
};
|
||||||
int i, j;
|
int i, j;
|
||||||
QString *str;
|
QString *str;
|
||||||
const char *json_in, *utf8_out, *utf8_in, *json_out;
|
const char *json_in, *utf8_out, *utf8_in, *json_out, *tail;
|
||||||
char *jstr;
|
char *end, *in, *jstr;
|
||||||
|
|
||||||
for (i = 0; test_cases[i].json_in; i++) {
|
for (i = 0; test_cases[i].json_in; i++) {
|
||||||
for (j = 0; j < 2; j++) {
|
for (j = 0; j < 2; j++) {
|
||||||
|
@ -810,6 +811,28 @@ static void utf8_string(void)
|
||||||
} else {
|
} else {
|
||||||
str = from_json_str(json_in, j, NULL);
|
str = from_json_str(json_in, j, NULL);
|
||||||
g_assert(!str);
|
g_assert(!str);
|
||||||
|
/*
|
||||||
|
* Failure may be due to any sequence, but *all* sequences
|
||||||
|
* are expected to fail. Test each one in isolation.
|
||||||
|
*/
|
||||||
|
for (tail = json_in; *tail; tail = end) {
|
||||||
|
mod_utf8_codepoint(tail, 6, &end);
|
||||||
|
if (*end == ' ') {
|
||||||
|
end++;
|
||||||
|
}
|
||||||
|
in = strndup(tail, end - tail);
|
||||||
|
str = from_json_str(in, j, NULL);
|
||||||
|
/*
|
||||||
|
* FIXME JSON parser accepts invalid sequence
|
||||||
|
* starting with \xC2..\xF4
|
||||||
|
*/
|
||||||
|
if (*in >= '\xC2' && *in <= '\xF4') {
|
||||||
|
g_free(str);
|
||||||
|
str = NULL;
|
||||||
|
}
|
||||||
|
g_assert(!str);
|
||||||
|
g_free(in);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Unparse @utf8_in, expect @json_out */
|
/* Unparse @utf8_in, expect @json_out */
|
||||||
|
|
Loading…
Reference in a new issue