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,6 +651,7 @@ namespace | ||
| 651 | ls_number_leading_zero, | 651 | ls_number_leading_zero, |
| 652 | ls_number_before_point, | 652 | ls_number_before_point, |
| 653 | ls_number_point, | 653 | ls_number_point, |
| 654 | + ls_number_after_point, | ||
| 654 | ls_alpha, | 655 | ls_alpha, |
| 655 | ls_string, | 656 | ls_string, |
| 656 | ls_backslash, | 657 | ls_backslash, |
| @@ -811,7 +812,7 @@ JSONParser::numberError() | @@ -811,7 +812,7 @@ JSONParser::numberError() | ||
| 811 | "JSON: offset " + std::to_string(offset) + | 812 | "JSON: offset " + std::to_string(offset) + |
| 812 | ": numeric literal: decimal point after e"); | 813 | ": numeric literal: decimal point after e"); |
| 813 | } else { | 814 | } else { |
| 814 | - // QTC::TC("libtests", "JSON parse duplicate point"); | 815 | + QTC::TC("libtests", "JSON parse duplicate point"); |
| 815 | throw std::runtime_error( | 816 | throw std::runtime_error( |
| 816 | "JSON: offset " + std::to_string(offset) + | 817 | "JSON: offset " + std::to_string(offset) + |
| 817 | ": numeric literal: decimal point already seen"); | 818 | ": numeric literal: decimal point already seen"); |
| @@ -957,7 +958,24 @@ JSONParser::getToken() | @@ -957,7 +958,24 @@ JSONParser::getToken() | ||
| 957 | case ls_number_point: | 958 | case ls_number_point: |
| 958 | if ((*p >= '0') && (*p <= '9')) { | 959 | if ((*p >= '0') && (*p <= '9')) { |
| 959 | ++number_after_point; | 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 | lex_state = ls_number; | 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 | } else { | 979 | } else { |
| 962 | numberError(); | 980 | numberError(); |
| 963 | } | 981 | } |
| @@ -979,7 +997,6 @@ JSONParser::getToken() | @@ -979,7 +997,6 @@ JSONParser::getToken() | ||
| 979 | "JSON: offset " + std::to_string(offset) + | 997 | "JSON: offset " + std::to_string(offset) + |
| 980 | ": numeric literal: decimal point after e"); | 998 | ": numeric literal: decimal point after e"); |
| 981 | } else if (number_saw_point) { | 999 | } else if (number_saw_point) { |
| 982 | - QTC::TC("libtests", "JSON parse duplicate point"); | ||
| 983 | throw std::runtime_error( | 1000 | throw std::runtime_error( |
| 984 | "JSON: offset " + std::to_string(offset) + | 1001 | "JSON: offset " + std::to_string(offset) + |
| 985 | ": numeric literal: decimal point already seen"); | 1002 | ": numeric literal: decimal point already seen"); |
| @@ -1092,6 +1109,7 @@ JSONParser::getToken() | @@ -1092,6 +1109,7 @@ JSONParser::getToken() | ||
| 1092 | 1109 | ||
| 1093 | case ls_number_before_point: | 1110 | case ls_number_before_point: |
| 1094 | case ls_number_point: | 1111 | case ls_number_point: |
| 1112 | + case ls_number_after_point: | ||
| 1095 | case ls_number: | 1113 | case ls_number: |
| 1096 | case ls_number_minus: | 1114 | case ls_number_minus: |
| 1097 | case ls_number_leading_zero: | 1115 | case ls_number_leading_zero: |
| @@ -1172,6 +1190,7 @@ JSONParser::handleToken() | @@ -1172,6 +1190,7 @@ JSONParser::handleToken() | ||
| 1172 | case ls_number_leading_zero: | 1190 | case ls_number_leading_zero: |
| 1173 | case ls_number_before_point: | 1191 | case ls_number_before_point: |
| 1174 | case ls_number_point: | 1192 | case ls_number_point: |
| 1193 | + case ls_number_after_point: | ||
| 1175 | if (number_saw_point && (number_after_point == 0)) { | 1194 | if (number_saw_point && (number_after_point == 0)) { |
| 1176 | // QTC::TC("libtests", "JSON parse decimal with no digits"); | 1195 | // QTC::TC("libtests", "JSON parse decimal with no digits"); |
| 1177 | throw std::runtime_error( | 1196 | throw std::runtime_error( |