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,6 +648,7 @@ namespace | ||
| 648 | ls_top, | 648 | ls_top, |
| 649 | ls_number, | 649 | ls_number, |
| 650 | ls_number_minus, | 650 | ls_number_minus, |
| 651 | + ls_number_leading_zero, | ||
| 651 | ls_alpha, | 652 | ls_alpha, |
| 652 | ls_string, | 653 | ls_string, |
| 653 | ls_backslash, | 654 | ls_backslash, |
| @@ -868,13 +869,20 @@ JSONParser::getToken() | @@ -868,13 +869,20 @@ JSONParser::getToken() | ||
| 868 | number_after_e = 0; | 869 | number_after_e = 0; |
| 869 | number_saw_point = false; | 870 | number_saw_point = false; |
| 870 | number_saw_e = false; | 871 | number_saw_e = false; |
| 871 | - } else if ((*p >= '0') && (*p <= '9')) { | 872 | + } else if ((*p >= '1') && (*p <= '9')) { |
| 872 | lex_state = ls_number; | 873 | lex_state = ls_number; |
| 873 | number_before_point = 1; | 874 | number_before_point = 1; |
| 874 | number_after_point = 0; | 875 | number_after_point = 0; |
| 875 | number_after_e = 0; | 876 | number_after_e = 0; |
| 876 | number_saw_point = false; | 877 | number_saw_point = false; |
| 877 | number_saw_e = false; | 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 | } else if (*p == '.') { | 886 | } else if (*p == '.') { |
| 879 | lex_state = ls_number; | 887 | lex_state = ls_number; |
| 880 | number_before_point = 0; | 888 | number_before_point = 0; |
| @@ -898,7 +906,7 @@ JSONParser::getToken() | @@ -898,7 +906,7 @@ JSONParser::getToken() | ||
| 898 | lex_state = ls_number; | 906 | lex_state = ls_number; |
| 899 | } else if (*p == '0') { | 907 | } else if (*p == '0') { |
| 900 | ++number_before_point; | 908 | ++number_before_point; |
| 901 | - lex_state = ls_number; | 909 | + lex_state = ls_number_leading_zero; |
| 902 | } else { | 910 | } else { |
| 903 | QTC::TC("libtests", "JSON parse number minus no digits"); | 911 | QTC::TC("libtests", "JSON parse number minus no digits"); |
| 904 | throw std::runtime_error( | 912 | throw std::runtime_error( |
| @@ -907,6 +915,25 @@ JSONParser::getToken() | @@ -907,6 +915,25 @@ JSONParser::getToken() | ||
| 907 | } | 915 | } |
| 908 | break; | 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 | case ls_number: | 937 | case ls_number: |
| 911 | if ((*p >= '0') && (*p <= '9')) { | 938 | if ((*p >= '0') && (*p <= '9')) { |
| 912 | if (number_saw_e) { | 939 | if (number_saw_e) { |
| @@ -1037,6 +1064,7 @@ JSONParser::getToken() | @@ -1037,6 +1064,7 @@ JSONParser::getToken() | ||
| 1037 | 1064 | ||
| 1038 | case ls_number: | 1065 | case ls_number: |
| 1039 | case ls_number_minus: | 1066 | case ls_number_minus: |
| 1067 | + case ls_number_leading_zero: | ||
| 1040 | case ls_alpha: | 1068 | case ls_alpha: |
| 1041 | // okay | 1069 | // okay |
| 1042 | break; | 1070 | break; |
| @@ -1111,6 +1139,7 @@ JSONParser::handleToken() | @@ -1111,6 +1139,7 @@ JSONParser::handleToken() | ||
| 1111 | 1139 | ||
| 1112 | case ls_number: | 1140 | case ls_number: |
| 1113 | case ls_number_minus: | 1141 | case ls_number_minus: |
| 1142 | + case ls_number_leading_zero: | ||
| 1114 | if (number_saw_point && (number_after_point == 0)) { | 1143 | if (number_saw_point && (number_after_point == 0)) { |
| 1115 | // QTC::TC("libtests", "JSON parse decimal with no digits"); | 1144 | // QTC::TC("libtests", "JSON parse decimal with no digits"); |
| 1116 | throw std::runtime_error( | 1145 | throw std::runtime_error( |
| @@ -1120,7 +1149,6 @@ JSONParser::handleToken() | @@ -1120,7 +1149,6 @@ JSONParser::handleToken() | ||
| 1120 | if ((number_before_point > 1) && | 1149 | if ((number_before_point > 1) && |
| 1121 | ((first_char == '0') || | 1150 | ((first_char == '0') || |
| 1122 | ((first_char == '-') && (token.at(1) == '0')))) { | 1151 | ((first_char == '-') && (token.at(1) == '0')))) { |
| 1123 | - QTC::TC("libtests", "JSON parse leading zero"); | ||
| 1124 | throw std::runtime_error( | 1152 | throw std::runtime_error( |
| 1125 | "JSON: offset " + std::to_string(offset) + | 1153 | "JSON: offset " + std::to_string(offset) + |
| 1126 | ": number with leading zero"); | 1154 | ": number with leading zero"); |
libtests/qtest/json_parse/bad-32.out
libtests/qtest/json_parse/bad-33.out