Commit 972ebca5055c5077b117c497355f264036fed1ec

Authored by m-holger
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(
... ...