json: escape u0000 .. u001F when outputting json

Markus Armbruster pointed out:

JSON requires control characters in strings to be escaped.  RFC 4627
section 2.5:

   A string begins and ends with quotation marks.  All Unicode
   characters may be placed within the quotation marks except for the
   characters that must be escaped: quotation mark, reverse solidus, and
   the control characters (U+0000 through U+001F).

We've been quoting the special escape sequences that JSON defines but we
haven't been encoding the full control character range.  This patch fixes that.

Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
Anthony Liguori 2010-01-25 08:56:53 -06:00
parent 6908d9ce4c
commit ff06ea2197

10
qjson.c
View File

@ -163,8 +163,14 @@ static void to_json(const QObject *obj, QString *str)
qstring_append(str, "\\t");
break;
default: {
char buf[2] = { ptr[0], 0 };
qstring_append(str, buf);
if (ptr[0] <= 0x1F) {
char escape[7];
snprintf(escape, sizeof(escape), "\\u%04X", ptr[0]);
qstring_append(str, escape);
} else {
char buf[2] = { ptr[0], 0 };
qstring_append(str, buf);
}
break;
}
}