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 | 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
libtests/qtest/json_parse/bad-30.out