Commit 320245e0d1b4be709abe98a2aa7ed1e4b9054af8
1 parent
cee746fc
In JSONParser::getToken decode escaped chars inside state ls_backslash
(except '\\' and '\uXXXX')
Showing
1 changed file
with
31 additions
and
6 deletions
libqpdf/JSON.cc
| @@ -790,7 +790,6 @@ JSONParser::decode_string(std::string const& str, qpdf_offset_t offset) | @@ -790,7 +790,6 @@ JSONParser::decode_string(std::string const& str, qpdf_offset_t offset) | ||
| 790 | i += 4; | 790 | i += 4; |
| 791 | break; | 791 | break; |
| 792 | default: | 792 | default: |
| 793 | - throw std::logic_error("JSON parse: bad character after \\"); | ||
| 794 | break; | 793 | break; |
| 795 | } | 794 | } |
| 796 | } else { | 795 | } else { |
| @@ -1052,17 +1051,43 @@ JSONParser::getToken() | @@ -1052,17 +1051,43 @@ JSONParser::getToken() | ||
| 1052 | ready = true; | 1051 | ready = true; |
| 1053 | } else if (*p == '\\') { | 1052 | } else if (*p == '\\') { |
| 1054 | lex_state = ls_backslash; | 1053 | lex_state = ls_backslash; |
| 1054 | + action = ignore; | ||
| 1055 | } | 1055 | } |
| 1056 | break; | 1056 | break; |
| 1057 | 1057 | ||
| 1058 | case ls_backslash: | 1058 | case ls_backslash: |
| 1059 | - /* cSpell: ignore bfnrt */ | ||
| 1060 | - if (strchr("\\\"/bfnrt", *p)) { | ||
| 1061 | - lex_state = ls_string; | ||
| 1062 | - } else if (*p == 'u') { | 1059 | + action = ignore; |
| 1060 | + lex_state = ls_string; | ||
| 1061 | + switch (*p) { | ||
| 1062 | + case '\\': | ||
| 1063 | + token += "\\\\"; | ||
| 1064 | + case '\"': | ||
| 1065 | + case '/': | ||
| 1066 | + // \/ is allowed in json input, but so is /, so we | ||
| 1067 | + // don't map / to \/ in output. | ||
| 1068 | + token += *p; | ||
| 1069 | + break; | ||
| 1070 | + case 'b': | ||
| 1071 | + token += '\b'; | ||
| 1072 | + break; | ||
| 1073 | + case 'f': | ||
| 1074 | + token += '\f'; | ||
| 1075 | + break; | ||
| 1076 | + case 'n': | ||
| 1077 | + token += '\n'; | ||
| 1078 | + break; | ||
| 1079 | + case 'r': | ||
| 1080 | + token += '\r'; | ||
| 1081 | + break; | ||
| 1082 | + case 't': | ||
| 1083 | + token += '\t'; | ||
| 1084 | + break; | ||
| 1085 | + case 'u': | ||
| 1086 | + token += "\\u"; | ||
| 1063 | lex_state = ls_u4; | 1087 | lex_state = ls_u4; |
| 1064 | u_count = 0; | 1088 | u_count = 0; |
| 1065 | - } else { | 1089 | + break; |
| 1090 | + default: | ||
| 1066 | QTC::TC("libtests", "JSON parse backslash bad character"); | 1091 | QTC::TC("libtests", "JSON parse backslash bad character"); |
| 1067 | throw std::runtime_error( | 1092 | throw std::runtime_error( |
| 1068 | "JSON: offset " + std::to_string(offset) + | 1093 | "JSON: offset " + std::to_string(offset) + |