Commit 08e768909d9760a3588b8a8eaaeda0b357a85c62
1 parent
cba1c352
In JSONParser add lex_state ls_number_leading_zero
Showing
3 changed files
with
33 additions
and
5 deletions
libqpdf/JSON.cc
| ... | ... | @@ -648,6 +648,7 @@ namespace |
| 648 | 648 | ls_top, |
| 649 | 649 | ls_number, |
| 650 | 650 | ls_number_minus, |
| 651 | + ls_number_leading_zero, | |
| 651 | 652 | ls_alpha, |
| 652 | 653 | ls_string, |
| 653 | 654 | ls_backslash, |
| ... | ... | @@ -868,13 +869,20 @@ JSONParser::getToken() |
| 868 | 869 | number_after_e = 0; |
| 869 | 870 | number_saw_point = false; |
| 870 | 871 | number_saw_e = false; |
| 871 | - } else if ((*p >= '0') && (*p <= '9')) { | |
| 872 | + } else if ((*p >= '1') && (*p <= '9')) { | |
| 872 | 873 | lex_state = ls_number; |
| 873 | 874 | number_before_point = 1; |
| 874 | 875 | number_after_point = 0; |
| 875 | 876 | number_after_e = 0; |
| 876 | 877 | number_saw_point = false; |
| 877 | 878 | number_saw_e = false; |
| 879 | + } else if (*p == '0') { | |
| 880 | + lex_state = ls_number_leading_zero; | |
| 881 | + number_before_point = 1; | |
| 882 | + number_after_point = 0; | |
| 883 | + number_after_e = 0; | |
| 884 | + number_saw_point = false; | |
| 885 | + number_saw_e = false; | |
| 878 | 886 | } else if (*p == '.') { |
| 879 | 887 | lex_state = ls_number; |
| 880 | 888 | number_before_point = 0; |
| ... | ... | @@ -898,7 +906,7 @@ JSONParser::getToken() |
| 898 | 906 | lex_state = ls_number; |
| 899 | 907 | } else if (*p == '0') { |
| 900 | 908 | ++number_before_point; |
| 901 | - lex_state = ls_number; | |
| 909 | + lex_state = ls_number_leading_zero; | |
| 902 | 910 | } else { |
| 903 | 911 | QTC::TC("libtests", "JSON parse number minus no digits"); |
| 904 | 912 | throw std::runtime_error( |
| ... | ... | @@ -907,6 +915,25 @@ JSONParser::getToken() |
| 907 | 915 | } |
| 908 | 916 | break; |
| 909 | 917 | |
| 918 | + case ls_number_leading_zero: | |
| 919 | + if (*p == '.') { | |
| 920 | + lex_state = ls_number; | |
| 921 | + } else if (*p == 'e') { | |
| 922 | + lex_state = ls_number; | |
| 923 | + } else if (QUtil::is_space(*p)) { | |
| 924 | + action = ignore; | |
| 925 | + ready = true; | |
| 926 | + } else if (strchr("{}[]:,", *p)) { | |
| 927 | + action = reread; | |
| 928 | + ready = true; | |
| 929 | + } else { | |
| 930 | + QTC::TC("libtests", "JSON parse leading zero"); | |
| 931 | + throw std::runtime_error( | |
| 932 | + "JSON: offset " + std::to_string(offset) + | |
| 933 | + ": number with leading zero"); | |
| 934 | + } | |
| 935 | + break; | |
| 936 | + | |
| 910 | 937 | case ls_number: |
| 911 | 938 | if ((*p >= '0') && (*p <= '9')) { |
| 912 | 939 | if (number_saw_e) { |
| ... | ... | @@ -1037,6 +1064,7 @@ JSONParser::getToken() |
| 1037 | 1064 | |
| 1038 | 1065 | case ls_number: |
| 1039 | 1066 | case ls_number_minus: |
| 1067 | + case ls_number_leading_zero: | |
| 1040 | 1068 | case ls_alpha: |
| 1041 | 1069 | // okay |
| 1042 | 1070 | break; |
| ... | ... | @@ -1111,6 +1139,7 @@ JSONParser::handleToken() |
| 1111 | 1139 | |
| 1112 | 1140 | case ls_number: |
| 1113 | 1141 | case ls_number_minus: |
| 1142 | + case ls_number_leading_zero: | |
| 1114 | 1143 | if (number_saw_point && (number_after_point == 0)) { |
| 1115 | 1144 | // QTC::TC("libtests", "JSON parse decimal with no digits"); |
| 1116 | 1145 | throw std::runtime_error( |
| ... | ... | @@ -1120,7 +1149,6 @@ JSONParser::handleToken() |
| 1120 | 1149 | if ((number_before_point > 1) && |
| 1121 | 1150 | ((first_char == '0') || |
| 1122 | 1151 | ((first_char == '-') && (token.at(1) == '0')))) { |
| 1123 | - QTC::TC("libtests", "JSON parse leading zero"); | |
| 1124 | 1152 | throw std::runtime_error( |
| 1125 | 1153 | "JSON: offset " + std::to_string(offset) + |
| 1126 | 1154 | ": number with leading zero"); | ... | ... |
libtests/qtest/json_parse/bad-32.out
libtests/qtest/json_parse/bad-33.out