Commit cdd1f0a9f60747ec0e25139dd530be3caf468eca

Authored by m-holger
1 parent bfda62ae

In JSONParser add lex_state ls_number_point

Also. remove '.' as  starting char in lsTop.
libqpdf/JSON.cc
... ... @@ -650,6 +650,7 @@ namespace
650 650 ls_number_minus,
651 651 ls_number_leading_zero,
652 652 ls_number_before_point,
  653 + ls_number_point,
653 654 ls_alpha,
654 655 ls_string,
655 656 ls_backslash,
... ... @@ -825,6 +826,11 @@ JSONParser::numberError()
825 826 throw std::runtime_error(
826 827 "JSON: offset " + std::to_string(offset) +
827 828 ": numeric literal: unexpected sign");
  829 + } else if (QUtil::is_space(*p) || strchr("{}[]:,", *p)) {
  830 + QTC::TC("libtests", "JSON parse incomplete number");
  831 + throw std::runtime_error(
  832 + "JSON: offset " + std::to_string(offset) +
  833 + ": numeric literal: incomplete number");
828 834 } else {
829 835 QTC::TC("libtests", "JSON parse numeric bad character");
830 836 throw std::runtime_error(
... ... @@ -884,13 +890,6 @@ JSONParser::getToken()
884 890 number_after_e = 0;
885 891 number_saw_point = false;
886 892 number_saw_e = false;
887   - } else if (*p == '.') {
888   - lex_state = ls_number;
889   - number_before_point = 0;
890   - number_after_point = 0;
891   - number_after_e = 0;
892   - number_saw_point = true;
893   - number_saw_e = false;
894 893 } else if (strchr("{}[]:,", *p)) {
895 894 ready = true;
896 895 } else {
... ... @@ -918,7 +917,7 @@ JSONParser::getToken()
918 917  
919 918 case ls_number_leading_zero:
920 919 if (*p == '.') {
921   - lex_state = ls_number;
  920 + lex_state = ls_number_point;
922 921 } else if (*p == 'e') {
923 922 lex_state = ls_number;
924 923 } else if (QUtil::is_space(*p)) {
... ... @@ -940,7 +939,7 @@ JSONParser::getToken()
940 939 ++number_before_point;
941 940 } else if (*p == '.') {
942 941 number_saw_point = true;
943   - lex_state = ls_number;
  942 + lex_state = ls_number_point;
944 943 } else if (*p == 'e') {
945 944 number_saw_e = true;
946 945 lex_state = ls_number;
... ... @@ -955,6 +954,15 @@ JSONParser::getToken()
955 954 }
956 955 break;
957 956  
  957 + case ls_number_point:
  958 + if ((*p >= '0') && (*p <= '9')) {
  959 + ++number_after_point;
  960 + lex_state = ls_number;
  961 + } else {
  962 + numberError();
  963 + }
  964 + break;
  965 +
958 966 case ls_number:
959 967 if ((*p >= '0') && (*p <= '9')) {
960 968 if (number_saw_e) {
... ... @@ -1083,6 +1091,7 @@ JSONParser::getToken()
1083 1091 break;
1084 1092  
1085 1093 case ls_number_before_point:
  1094 + case ls_number_point:
1086 1095 case ls_number:
1087 1096 case ls_number_minus:
1088 1097 case ls_number_leading_zero:
... ... @@ -1158,10 +1167,11 @@ JSONParser::handleToken()
1158 1167 }
1159 1168 break;
1160 1169  
1161   - case ls_number_before_point:
1162 1170 case ls_number:
1163 1171 case ls_number_minus:
1164 1172 case ls_number_leading_zero:
  1173 + case ls_number_before_point:
  1174 + case ls_number_point:
1165 1175 if (number_saw_point && (number_after_point == 0)) {
1166 1176 // QTC::TC("libtests", "JSON parse decimal with no digits");
1167 1177 throw std::runtime_error(
... ...
libtests/libtests.testcov
... ... @@ -76,6 +76,7 @@ JSON parse duplicate e 0
76 76 JSON parse unexpected sign 0
77 77 JSON parse numeric bad character 0
78 78 JSON parse number minus no digits 0
  79 +JSON parse incomplete number 0
79 80 JSON parse keyword bad character 0
80 81 JSON parse backslash bad character 0
81 82 JSON parse unterminated string 0
... ...
libtests/qtest/json_parse/bad-04.out
1   -exception: bad-04.json: JSON: offset 5: decimal point with no digits
  1 +exception: bad-04.json: JSON: offset 4: unexpected character .
... ...
libtests/qtest/json_parse/bad-30.out
1   -exception: bad-30.json: JSON: offset 5: decimal point with no digits
  1 +exception: bad-30.json: JSON: offset 4: numeric literal: incomplete number
... ...