diff options
author | m-holger <m-holger@kubitscheck.org> | 2023-01-27 19:02:35 +0100 |
---|---|---|
committer | m-holger <m-holger@kubitscheck.org> | 2023-02-04 15:06:26 +0100 |
commit | 320245e0d1b4be709abe98a2aa7ed1e4b9054af8 (patch) | |
tree | c8d0cb196f1197ede7214b5858764b530128902f | |
parent | cee746fc154e82df43f427b4e6112fcb50070814 (diff) | |
download | qpdf-320245e0d1b4be709abe98a2aa7ed1e4b9054af8.tar.zst |
In JSONParser::getToken decode escaped chars inside state ls_backslash
(except '\\' and '\uXXXX')
-rw-r--r-- | libqpdf/JSON.cc | 37 |
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) + |