aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorm-holger <m-holger@kubitscheck.org>2023-01-27 19:02:35 +0100
committerm-holger <m-holger@kubitscheck.org>2023-02-04 15:06:26 +0100
commit320245e0d1b4be709abe98a2aa7ed1e4b9054af8 (patch)
treec8d0cb196f1197ede7214b5858764b530128902f
parentcee746fc154e82df43f427b4e6112fcb50070814 (diff)
downloadqpdf-320245e0d1b4be709abe98a2aa7ed1e4b9054af8.tar.zst
In JSONParser::getToken decode escaped chars inside state ls_backslash
(except '\\' and '\uXXXX')
-rw-r--r--libqpdf/JSON.cc37
1 files changed, 31 insertions, 6 deletions
diff --git a/libqpdf/JSON.cc b/libqpdf/JSON.cc
index 51617483..f92d3ef8 100644
--- a/libqpdf/JSON.cc
+++ b/libqpdf/JSON.cc
@@ -790,7 +790,6 @@ JSONParser::decode_string(std::string const& str, qpdf_offset_t offset)
i += 4;
break;
default:
- throw std::logic_error("JSON parse: bad character after \\");
break;
}
} else {
@@ -1052,17 +1051,43 @@ JSONParser::getToken()
ready = true;
} else if (*p == '\\') {
lex_state = ls_backslash;
+ action = ignore;
}
break;
case ls_backslash:
- /* cSpell: ignore bfnrt */
- if (strchr("\\\"/bfnrt", *p)) {
- lex_state = ls_string;
- } else if (*p == 'u') {
+ action = ignore;
+ lex_state = ls_string;
+ switch (*p) {
+ case '\\':
+ token += "\\\\";
+ case '\"':
+ case '/':
+ // \/ is allowed in json input, but so is /, so we
+ // don't map / to \/ in output.
+ token += *p;
+ break;
+ case 'b':
+ token += '\b';
+ break;
+ case 'f':
+ token += '\f';
+ break;
+ case 'n':
+ token += '\n';
+ break;
+ case 'r':
+ token += '\r';
+ break;
+ case 't':
+ token += '\t';
+ break;
+ case 'u':
+ token += "\\u";
lex_state = ls_u4;
u_count = 0;
- } else {
+ break;
+ default:
QTC::TC("libtests", "JSON parse backslash bad character");
throw std::runtime_error(
"JSON: offset " + std::to_string(offset) +