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,6 +653,7 @@ namespace | ||
| 653 | ls_number_point, | 653 | ls_number_point, |
| 654 | ls_number_after_point, | 654 | ls_number_after_point, |
| 655 | ls_number_e, | 655 | ls_number_e, |
| 656 | + ls_number_e_sign, | ||
| 656 | ls_alpha, | 657 | ls_alpha, |
| 657 | ls_string, | 658 | ls_string, |
| 658 | ls_backslash, | 659 | ls_backslash, |
| @@ -988,6 +989,14 @@ JSONParser::getToken() | @@ -988,6 +989,14 @@ JSONParser::getToken() | ||
| 988 | ++number_after_e; | 989 | ++number_after_e; |
| 989 | lex_state = ls_number; | 990 | lex_state = ls_number; |
| 990 | } else if ((*p == '+') || (*p == '-')) { | 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 | lex_state = ls_number; | 1000 | lex_state = ls_number; |
| 992 | } else { | 1001 | } else { |
| 993 | numberError(); | 1002 | numberError(); |
| @@ -1120,13 +1129,14 @@ JSONParser::getToken() | @@ -1120,13 +1129,14 @@ JSONParser::getToken() | ||
| 1120 | throw std::logic_error("tok_start set in ls_top while parsing"); | 1129 | throw std::logic_error("tok_start set in ls_top while parsing"); |
| 1121 | break; | 1130 | break; |
| 1122 | 1131 | ||
| 1132 | + case ls_number: | ||
| 1133 | + case ls_number_minus: | ||
| 1134 | + case ls_number_leading_zero: | ||
| 1123 | case ls_number_before_point: | 1135 | case ls_number_before_point: |
| 1124 | case ls_number_point: | 1136 | case ls_number_point: |
| 1125 | case ls_number_after_point: | 1137 | case ls_number_after_point: |
| 1126 | case ls_number_e: | 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 | case ls_alpha: | 1140 | case ls_alpha: |
| 1131 | // okay | 1141 | // okay |
| 1132 | break; | 1142 | break; |
| @@ -1206,6 +1216,7 @@ JSONParser::handleToken() | @@ -1206,6 +1216,7 @@ JSONParser::handleToken() | ||
| 1206 | case ls_number_point: | 1216 | case ls_number_point: |
| 1207 | case ls_number_after_point: | 1217 | case ls_number_after_point: |
| 1208 | case ls_number_e: | 1218 | case ls_number_e: |
| 1219 | + case ls_number_e_sign: | ||
| 1209 | if (number_saw_point && (number_after_point == 0)) { | 1220 | if (number_saw_point && (number_after_point == 0)) { |
| 1210 | // QTC::TC("libtests", "JSON parse decimal with no digits"); | 1221 | // QTC::TC("libtests", "JSON parse decimal with no digits"); |
| 1211 | throw std::runtime_error( | 1222 | throw std::runtime_error( |
libtests/qtest/json_parse.test
| @@ -123,6 +123,8 @@ my @bad = ( | @@ -123,6 +123,8 @@ my @bad = ( | ||
| 123 | "duplicate dictionary key", # 40 | 123 | "duplicate dictionary key", # 40 |
| 124 | "decimal point after minus",# 41 | 124 | "decimal point after minus",# 41 |
| 125 | "e after minus", # 42 | 125 | "e after minus", # 42 |
| 126 | + "missing digit after e", # 43 | ||
| 127 | + "missing digit after e+/-", # 44 | ||
| 126 | ); | 128 | ); |
| 127 | 129 | ||
| 128 | my $i = 0; | 130 | my $i = 0; |
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 |