diff options
author | Jelte Jansen <jelte@isc.org> | 2012-03-30 11:14:57 +0200 |
---|---|---|
committer | Jelte Jansen <jelte@isc.org> | 2012-03-30 11:14:57 +0200 |
commit | 737c4eb744e7edcd77410a11000b49e17ca3af8b (patch) | |
tree | 3d2d24d99ea6b4218953ed28467d495053ff4f02 /src/lib/cc/data.cc | |
parent | [1626] remove wrong comment line (diff) | |
download | kea-737c4eb744e7edcd77410a11000b49e17ca3af8b.tar.xz kea-737c4eb744e7edcd77410a11000b49e17ca3af8b.zip |
[1626] fix non-printable escaping in json conv
Diffstat (limited to 'src/lib/cc/data.cc')
-rw-r--r-- | src/lib/cc/data.cc | 61 |
1 files changed, 53 insertions, 8 deletions
diff --git a/src/lib/cc/data.cc b/src/lib/cc/data.cc index 612dc9c51e..e0bed90312 100644 --- a/src/lib/cc/data.cc +++ b/src/lib/cc/data.cc @@ -318,13 +318,37 @@ str_from_stringstream(std::istream &in, const std::string& file, const int line, while (c != EOF && c != '"') { if (c == '\\') { // see the spec for allowed escape characters - if (strchr("\"\\/\b\f\n\r\t", in.peek()) != NULL) { - // drop the escape - c = in.get(); - ++pos; - } else { + switch (in.peek()) { + case '"': + c = '"'; + break; + case '/': + c = '/'; + break; + case '\\': + c = '\\'; + break; + case 'b': + c = '\b'; + break; + case 'f': + c = '\f'; + break; + case 'n': + c = '\n'; + break; + case 'r': + c = '\r'; + break; + case 't': + c = '\t'; + break; + default: throwJSONError("Bad escape", file, line, pos); } + // drop the escaped char + in.get(); + ++pos; } ss << c; c = in.get(); @@ -656,10 +680,31 @@ StringElement::toJSON(std::ostream& ss) const { // Escape characters as defined in JSON spec // Note that we do not escape forward slash; this // is allowed, but not mandatory. - if (strchr("\"\\\b\f\n\r\t", c) != NULL) { - ss << '\\'; + switch (c) { + case '"': + ss << '\\' << c; + break; + case '\\': + ss << '\\' << c; + break; + case '\b': + ss << '\\' << 'b'; + break; + case '\f': + ss << '\\' << 'f'; + break; + case '\n': + ss << '\\' << 'n'; + break; + case '\r': + ss << '\\' << 'r'; + break; + case '\t': + ss << '\\' << 't'; + break; + default: + ss << c; } - ss << c; } ss << "\""; } |