2
0
mirror of https://gitlab.isc.org/isc-projects/kea synced 2025-08-30 05:27:55 +00:00

[1626] fix non-printable escaping in json conv

This commit is contained in:
Jelte Jansen 2012-03-30 11:14:57 +02:00
parent 9f4292fa5d
commit 737c4eb744
2 changed files with 58 additions and 13 deletions

View File

@ -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 << "\"";
}

View File

@ -321,11 +321,11 @@ TEST(Element, escape) {
// String elements.
escapeHelper("foo\"bar", "\"foo\\\"bar\"");
escapeHelper("foo\\bar", "\"foo\\\\bar\"");
escapeHelper("foo\bbar", "\"foo\\\bbar\"");
escapeHelper("foo\fbar", "\"foo\\\fbar\"");
escapeHelper("foo\nbar", "\"foo\\\nbar\"");
escapeHelper("foo\rbar", "\"foo\\\rbar\"");
escapeHelper("foo\tbar", "\"foo\\\tbar\"");
escapeHelper("foo\bbar", "\"foo\\bbar\"");
escapeHelper("foo\fbar", "\"foo\\fbar\"");
escapeHelper("foo\nbar", "\"foo\\nbar\"");
escapeHelper("foo\rbar", "\"foo\\rbar\"");
escapeHelper("foo\tbar", "\"foo\\tbar\"");
// Bad escapes
EXPECT_THROW(Element::fromJSON("\\a"), JSONError);
EXPECT_THROW(Element::fromJSON("\\"), JSONError);