Commit 972ebca5055c5077b117c497355f264036fed1ec
1 parent
cdd1f0a9
In JSONParser add lex_state ls_number_after_point
Showing
1 changed file
with
21 additions
and
2 deletions
libqpdf/JSON.cc
| ... | ... | @@ -651,6 +651,7 @@ namespace |
| 651 | 651 | ls_number_leading_zero, |
| 652 | 652 | ls_number_before_point, |
| 653 | 653 | ls_number_point, |
| 654 | + ls_number_after_point, | |
| 654 | 655 | ls_alpha, |
| 655 | 656 | ls_string, |
| 656 | 657 | ls_backslash, |
| ... | ... | @@ -811,7 +812,7 @@ JSONParser::numberError() |
| 811 | 812 | "JSON: offset " + std::to_string(offset) + |
| 812 | 813 | ": numeric literal: decimal point after e"); |
| 813 | 814 | } else { |
| 814 | - // QTC::TC("libtests", "JSON parse duplicate point"); | |
| 815 | + QTC::TC("libtests", "JSON parse duplicate point"); | |
| 815 | 816 | throw std::runtime_error( |
| 816 | 817 | "JSON: offset " + std::to_string(offset) + |
| 817 | 818 | ": numeric literal: decimal point already seen"); |
| ... | ... | @@ -957,7 +958,24 @@ JSONParser::getToken() |
| 957 | 958 | case ls_number_point: |
| 958 | 959 | if ((*p >= '0') && (*p <= '9')) { |
| 959 | 960 | ++number_after_point; |
| 961 | + lex_state = ls_number_after_point; | |
| 962 | + } else { | |
| 963 | + numberError(); | |
| 964 | + } | |
| 965 | + break; | |
| 966 | + | |
| 967 | + case ls_number_after_point: | |
| 968 | + if ((*p >= '0') && (*p <= '9')) { | |
| 969 | + ++number_after_point; | |
| 970 | + } else if (*p == 'e') { | |
| 971 | + number_saw_e = true; | |
| 960 | 972 | lex_state = ls_number; |
| 973 | + } else if (QUtil::is_space(*p)) { | |
| 974 | + action = ignore; | |
| 975 | + ready = true; | |
| 976 | + } else if (strchr("{}[]:,", *p)) { | |
| 977 | + action = reread; | |
| 978 | + ready = true; | |
| 961 | 979 | } else { |
| 962 | 980 | numberError(); |
| 963 | 981 | } |
| ... | ... | @@ -979,7 +997,6 @@ JSONParser::getToken() |
| 979 | 997 | "JSON: offset " + std::to_string(offset) + |
| 980 | 998 | ": numeric literal: decimal point after e"); |
| 981 | 999 | } else if (number_saw_point) { |
| 982 | - QTC::TC("libtests", "JSON parse duplicate point"); | |
| 983 | 1000 | throw std::runtime_error( |
| 984 | 1001 | "JSON: offset " + std::to_string(offset) + |
| 985 | 1002 | ": numeric literal: decimal point already seen"); |
| ... | ... | @@ -1092,6 +1109,7 @@ JSONParser::getToken() |
| 1092 | 1109 | |
| 1093 | 1110 | case ls_number_before_point: |
| 1094 | 1111 | case ls_number_point: |
| 1112 | + case ls_number_after_point: | |
| 1095 | 1113 | case ls_number: |
| 1096 | 1114 | case ls_number_minus: |
| 1097 | 1115 | case ls_number_leading_zero: |
| ... | ... | @@ -1172,6 +1190,7 @@ JSONParser::handleToken() |
| 1172 | 1190 | case ls_number_leading_zero: |
| 1173 | 1191 | case ls_number_before_point: |
| 1174 | 1192 | case ls_number_point: |
| 1193 | + case ls_number_after_point: | |
| 1175 | 1194 | if (number_saw_point && (number_after_point == 0)) { |
| 1176 | 1195 | // QTC::TC("libtests", "JSON parse decimal with no digits"); |
| 1177 | 1196 | throw std::runtime_error( | ... | ... |