Commit 6ea543e6c731db30b0807f531a445a66c66619b9
1 parent
04333bbc
In JSONParser add lex_state ls_number_e_sign
Showing
6 changed files
with
20 additions
and
3 deletions
libqpdf/JSON.cc
| ... | ... | @@ -653,6 +653,7 @@ namespace |
| 653 | 653 | ls_number_point, |
| 654 | 654 | ls_number_after_point, |
| 655 | 655 | ls_number_e, |
| 656 | + ls_number_e_sign, | |
| 656 | 657 | ls_alpha, |
| 657 | 658 | ls_string, |
| 658 | 659 | ls_backslash, |
| ... | ... | @@ -988,6 +989,14 @@ JSONParser::getToken() |
| 988 | 989 | ++number_after_e; |
| 989 | 990 | lex_state = ls_number; |
| 990 | 991 | } else if ((*p == '+') || (*p == '-')) { |
| 992 | + lex_state = ls_number_e_sign; | |
| 993 | + } else { | |
| 994 | + numberError(); | |
| 995 | + } | |
| 996 | + break; | |
| 997 | + | |
| 998 | + case ls_number_e_sign: | |
| 999 | + if ((*p >= '0') && (*p <= '9')) { | |
| 991 | 1000 | lex_state = ls_number; |
| 992 | 1001 | } else { |
| 993 | 1002 | numberError(); |
| ... | ... | @@ -1120,13 +1129,14 @@ JSONParser::getToken() |
| 1120 | 1129 | throw std::logic_error("tok_start set in ls_top while parsing"); |
| 1121 | 1130 | break; |
| 1122 | 1131 | |
| 1132 | + case ls_number: | |
| 1133 | + case ls_number_minus: | |
| 1134 | + case ls_number_leading_zero: | |
| 1123 | 1135 | case ls_number_before_point: |
| 1124 | 1136 | case ls_number_point: |
| 1125 | 1137 | case ls_number_after_point: |
| 1126 | 1138 | case ls_number_e: |
| 1127 | - case ls_number: | |
| 1128 | - case ls_number_minus: | |
| 1129 | - case ls_number_leading_zero: | |
| 1139 | + case ls_number_e_sign: | |
| 1130 | 1140 | case ls_alpha: |
| 1131 | 1141 | // okay |
| 1132 | 1142 | break; |
| ... | ... | @@ -1206,6 +1216,7 @@ JSONParser::handleToken() |
| 1206 | 1216 | case ls_number_point: |
| 1207 | 1217 | case ls_number_after_point: |
| 1208 | 1218 | case ls_number_e: |
| 1219 | + case ls_number_e_sign: | |
| 1209 | 1220 | if (number_saw_point && (number_after_point == 0)) { |
| 1210 | 1221 | // QTC::TC("libtests", "JSON parse decimal with no digits"); |
| 1211 | 1222 | throw std::runtime_error( | ... | ... |
libtests/qtest/json_parse.test
libtests/qtest/json_parse/bad-43.json
0 → 100644
| 1 | +123e | ... | ... |
libtests/qtest/json_parse/bad-43.out
0 → 100644
| 1 | +exception: bad-43.json: JSON: offset 4: numeric literal: incomplete number | ... | ... |
libtests/qtest/json_parse/bad-44.json
0 → 100644
| 1 | +123e+ | ... | ... |
libtests/qtest/json_parse/bad-44.out
0 → 100644
| 1 | +exception: bad-44.json: JSON: offset 5: numeric literal: incomplete number | ... | ... |