summaryrefslogtreecommitdiffstats
path: root/src/lib/cc/data.cc
diff options
context:
space:
mode:
authorJelte Jansen <jelte@isc.org>2012-03-30 11:14:57 +0200
committerJelte Jansen <jelte@isc.org>2012-03-30 11:14:57 +0200
commit737c4eb744e7edcd77410a11000b49e17ca3af8b (patch)
tree3d2d24d99ea6b4218953ed28467d495053ff4f02 /src/lib/cc/data.cc
parent[1626] remove wrong comment line (diff)
downloadkea-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.cc61
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 << "\"";
}