Commit cdd1f0a9f60747ec0e25139dd530be3caf468eca
1 parent
bfda62ae
In JSONParser add lex_state ls_number_point
Also. remove '.' as starting char in lsTop.
Showing
4 changed files
with
23 additions
and
12 deletions
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
libtests/qtest/json_parse/bad-30.out