aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony Liguori <aliguori@us.ibm.com>2010-01-25 08:56:53 -0600
committerAnthony Liguori <aliguori@us.ibm.com>2010-01-26 14:54:59 -0600
commitff06ea219763559bec2aab26dde1cec8608405e9 (patch)
tree47721d5fd7ddf3a4018eac3f495f2cef93400379
parent6908d9ce4c26a8bc00e3616bc0764bbb292d6bfd (diff)
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>
-rw-r--r--qjson.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/qjson.c b/qjson.c
index 60c904d3ff..9ad8a91208 100644
--- a/qjson.c
+++ b/qjson.c
@@ -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;
}
}