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