Commit 04333bbc201963a8e716c5949bad071ea6c1a2fe

Authored by m-holger
1 parent 972ebca5

In JSONParser add lex_state ls_number_e

Also, allow 'E' as alternative to 'e'.
Showing 1 changed file with 25 additions and 10 deletions
libqpdf/JSON.cc
... ... @@ -652,6 +652,7 @@ namespace
652 652 ls_number_before_point,
653 653 ls_number_point,
654 654 ls_number_after_point,
  655 + ls_number_e,
655 656 ls_alpha,
656 657 ls_string,
657 658 ls_backslash,
... ... @@ -817,7 +818,7 @@ JSONParser::numberError()
817 818 "JSON: offset " + std::to_string(offset) +
818 819 ": numeric literal: decimal point already seen");
819 820 }
820   - } else if (*p == 'e') {
  821 + } else if (*p == 'e' || *p == 'E') {
821 822 // QTC::TC("libtests", "JSON parse duplicate e");
822 823 throw std::runtime_error(
823 824 "JSON: offset " + std::to_string(offset) +
... ... @@ -919,14 +920,15 @@ JSONParser::getToken()
919 920 case ls_number_leading_zero:
920 921 if (*p == '.') {
921 922 lex_state = ls_number_point;
922   - } else if (*p == 'e') {
923   - lex_state = ls_number;
924 923 } else if (QUtil::is_space(*p)) {
925 924 action = ignore;
926 925 ready = true;
927 926 } else if (strchr("{}[]:,", *p)) {
928 927 action = reread;
929 928 ready = true;
  929 + } else if (*p == 'e' || *p == 'E') {
  930 + number_saw_e = true;
  931 + lex_state = ls_number_e;
930 932 } else {
931 933 QTC::TC("libtests", "JSON parse leading zero");
932 934 throw std::runtime_error(
... ... @@ -941,15 +943,15 @@ JSONParser::getToken()
941 943 } else if (*p == '.') {
942 944 number_saw_point = true;
943 945 lex_state = ls_number_point;
944   - } else if (*p == 'e') {
945   - number_saw_e = true;
946   - lex_state = ls_number;
947 946 } else if (QUtil::is_space(*p)) {
948 947 action = ignore;
949 948 ready = true;
950 949 } else if (strchr("{}[]:,", *p)) {
951 950 action = reread;
952 951 ready = true;
  952 + } else if (*p == 'e' || *p == 'E') {
  953 + number_saw_e = true;
  954 + lex_state = ls_number_e;
953 955 } else {
954 956 numberError();
955 957 }
... ... @@ -967,15 +969,26 @@ JSONParser::getToken()
967 969 case ls_number_after_point:
968 970 if ((*p >= '0') && (*p <= '9')) {
969 971 ++number_after_point;
970   - } else if (*p == 'e') {
971   - number_saw_e = true;
972   - lex_state = ls_number;
973 972 } else if (QUtil::is_space(*p)) {
974 973 action = ignore;
975 974 ready = true;
976 975 } else if (strchr("{}[]:,", *p)) {
977 976 action = reread;
978 977 ready = true;
  978 + } else if (*p == 'e' || *p == 'E') {
  979 + number_saw_e = true;
  980 + lex_state = ls_number_e;
  981 + } else {
  982 + numberError();
  983 + }
  984 + break;
  985 +
  986 + case ls_number_e:
  987 + if ((*p >= '0') && (*p <= '9')) {
  988 + ++number_after_e;
  989 + lex_state = ls_number;
  990 + } else if ((*p == '+') || (*p == '-')) {
  991 + lex_state = ls_number;
979 992 } else {
980 993 numberError();
981 994 }
... ... @@ -1003,7 +1016,7 @@ JSONParser::getToken()
1003 1016 } else {
1004 1017 number_saw_point = true;
1005 1018 }
1006   - } else if (*p == 'e') {
  1019 + } else if (*p == 'e' || *p == 'E') {
1007 1020 if (number_saw_e) {
1008 1021 QTC::TC("libtests", "JSON parse duplicate e");
1009 1022 throw std::runtime_error(
... ... @@ -1110,6 +1123,7 @@ JSONParser::getToken()
1110 1123 case ls_number_before_point:
1111 1124 case ls_number_point:
1112 1125 case ls_number_after_point:
  1126 + case ls_number_e:
1113 1127 case ls_number:
1114 1128 case ls_number_minus:
1115 1129 case ls_number_leading_zero:
... ... @@ -1191,6 +1205,7 @@ JSONParser::handleToken()
1191 1205 case ls_number_before_point:
1192 1206 case ls_number_point:
1193 1207 case ls_number_after_point:
  1208 + case ls_number_e:
1194 1209 if (number_saw_point && (number_after_point == 0)) {
1195 1210 // QTC::TC("libtests", "JSON parse decimal with no digits");
1196 1211 throw std::runtime_error(
... ...