Commit cba1c352e3c4236205dc96de643e780abb3c7b64
1 parent
b6b4d3b2
In JSONParser add lex_state ls_number_minus
Showing
8 changed files
with
30 additions
and
6 deletions
libqpdf/JSON.cc
| @@ -647,6 +647,7 @@ namespace | @@ -647,6 +647,7 @@ namespace | ||
| 647 | enum lex_state_e { | 647 | enum lex_state_e { |
| 648 | ls_top, | 648 | ls_top, |
| 649 | ls_number, | 649 | ls_number, |
| 650 | + ls_number_minus, | ||
| 650 | ls_alpha, | 651 | ls_alpha, |
| 651 | ls_string, | 652 | ls_string, |
| 652 | ls_backslash, | 653 | ls_backslash, |
| @@ -861,7 +862,7 @@ JSONParser::getToken() | @@ -861,7 +862,7 @@ JSONParser::getToken() | ||
| 861 | } else if ((*p >= 'a') && (*p <= 'z')) { | 862 | } else if ((*p >= 'a') && (*p <= 'z')) { |
| 862 | lex_state = ls_alpha; | 863 | lex_state = ls_alpha; |
| 863 | } else if (*p == '-') { | 864 | } else if (*p == '-') { |
| 864 | - lex_state = ls_number; | 865 | + lex_state = ls_number_minus; |
| 865 | number_before_point = 0; | 866 | number_before_point = 0; |
| 866 | number_after_point = 0; | 867 | number_after_point = 0; |
| 867 | number_after_e = 0; | 868 | number_after_e = 0; |
| @@ -891,6 +892,21 @@ JSONParser::getToken() | @@ -891,6 +892,21 @@ JSONParser::getToken() | ||
| 891 | } | 892 | } |
| 892 | break; | 893 | break; |
| 893 | 894 | ||
| 895 | + case ls_number_minus: | ||
| 896 | + if ((*p >= '1') && (*p <= '9')) { | ||
| 897 | + ++number_before_point; | ||
| 898 | + lex_state = ls_number; | ||
| 899 | + } else if (*p == '0') { | ||
| 900 | + ++number_before_point; | ||
| 901 | + lex_state = ls_number; | ||
| 902 | + } else { | ||
| 903 | + QTC::TC("libtests", "JSON parse number minus no digits"); | ||
| 904 | + throw std::runtime_error( | ||
| 905 | + "JSON: offset " + std::to_string(offset) + | ||
| 906 | + ": numeric literal: no digit after minus sign"); | ||
| 907 | + } | ||
| 908 | + break; | ||
| 909 | + | ||
| 894 | case ls_number: | 910 | case ls_number: |
| 895 | if ((*p >= '0') && (*p <= '9')) { | 911 | if ((*p >= '0') && (*p <= '9')) { |
| 896 | if (number_saw_e) { | 912 | if (number_saw_e) { |
| @@ -1020,6 +1036,7 @@ JSONParser::getToken() | @@ -1020,6 +1036,7 @@ JSONParser::getToken() | ||
| 1020 | break; | 1036 | break; |
| 1021 | 1037 | ||
| 1022 | case ls_number: | 1038 | case ls_number: |
| 1039 | + case ls_number_minus: | ||
| 1023 | case ls_alpha: | 1040 | case ls_alpha: |
| 1024 | // okay | 1041 | // okay |
| 1025 | break; | 1042 | break; |
| @@ -1093,8 +1110,9 @@ JSONParser::handleToken() | @@ -1093,8 +1110,9 @@ JSONParser::handleToken() | ||
| 1093 | break; | 1110 | break; |
| 1094 | 1111 | ||
| 1095 | case ls_number: | 1112 | case ls_number: |
| 1113 | + case ls_number_minus: | ||
| 1096 | if (number_saw_point && (number_after_point == 0)) { | 1114 | if (number_saw_point && (number_after_point == 0)) { |
| 1097 | - QTC::TC("libtests", "JSON parse decimal with no digits"); | 1115 | + // QTC::TC("libtests", "JSON parse decimal with no digits"); |
| 1098 | throw std::runtime_error( | 1116 | throw std::runtime_error( |
| 1099 | "JSON: offset " + std::to_string(offset) + | 1117 | "JSON: offset " + std::to_string(offset) + |
| 1100 | ": decimal point with no digits"); | 1118 | ": decimal point with no digits"); |
| @@ -1108,7 +1126,7 @@ JSONParser::handleToken() | @@ -1108,7 +1126,7 @@ JSONParser::handleToken() | ||
| 1108 | ": number with leading zero"); | 1126 | ": number with leading zero"); |
| 1109 | } | 1127 | } |
| 1110 | if ((number_before_point == 0) && (number_after_point == 0)) { | 1128 | if ((number_before_point == 0) && (number_after_point == 0)) { |
| 1111 | - QTC::TC("libtests", "JSON parse number no digits"); | 1129 | + // QTC::TC("libtests", "JSON parse number no digits"); |
| 1112 | throw std::runtime_error( | 1130 | throw std::runtime_error( |
| 1113 | "JSON: offset " + std::to_string(offset) + | 1131 | "JSON: offset " + std::to_string(offset) + |
| 1114 | ": number with no digits"); | 1132 | ": number with no digits"); |
libtests/libtests.testcov
| @@ -58,7 +58,6 @@ QPDFArgParser bad option for help 0 | @@ -58,7 +58,6 @@ QPDFArgParser bad option for help 0 | ||
| 58 | QPDFArgParser bad topic for help 0 | 58 | QPDFArgParser bad topic for help 0 |
| 59 | QPDFArgParser invalid choice handler to unknown 0 | 59 | QPDFArgParser invalid choice handler to unknown 0 |
| 60 | JSON parse junk after object 0 | 60 | JSON parse junk after object 0 |
| 61 | -JSON parse decimal with no digits 0 | ||
| 62 | JSON parse invalid keyword 0 | 61 | JSON parse invalid keyword 0 |
| 63 | JSON parse expected colon 0 | 62 | JSON parse expected colon 0 |
| 64 | JSON parse expected , or } 0 | 63 | JSON parse expected , or } 0 |
| @@ -76,11 +75,11 @@ JSON parse duplicate point 0 | @@ -76,11 +75,11 @@ JSON parse duplicate point 0 | ||
| 76 | JSON parse duplicate e 0 | 75 | JSON parse duplicate e 0 |
| 77 | JSON parse unexpected sign 0 | 76 | JSON parse unexpected sign 0 |
| 78 | JSON parse numeric bad character 0 | 77 | JSON parse numeric bad character 0 |
| 78 | +JSON parse number minus no digits 0 | ||
| 79 | JSON parse keyword bad character 0 | 79 | JSON parse keyword bad character 0 |
| 80 | JSON parse backslash bad character 0 | 80 | JSON parse backslash bad character 0 |
| 81 | JSON parse unterminated string 0 | 81 | JSON parse unterminated string 0 |
| 82 | JSON parse leading zero 0 | 82 | JSON parse leading zero 0 |
| 83 | -JSON parse number no digits 0 | ||
| 84 | JSON parse premature end of u 0 | 83 | JSON parse premature end of u 0 |
| 85 | JSON parse bad hex after u 0 | 84 | JSON parse bad hex after u 0 |
| 86 | JSONHandler unhandled value 0 | 85 | JSONHandler unhandled value 0 |
libtests/qtest/json_parse.test
| @@ -121,6 +121,8 @@ my @bad = ( | @@ -121,6 +121,8 @@ my @bad = ( | ||
| 121 | "high high surrogate", # 38 | 121 | "high high surrogate", # 38 |
| 122 | "dangling high surrogate", # 39 | 122 | "dangling high surrogate", # 39 |
| 123 | "duplicate dictionary key", # 40 | 123 | "duplicate dictionary key", # 40 |
| 124 | + "decimal point after minus",# 41 | ||
| 125 | + "e after minus", # 42 | ||
| 124 | ); | 126 | ); |
| 125 | 127 | ||
| 126 | my $i = 0; | 128 | my $i = 0; |
libtests/qtest/json_parse/bad-31.out
libtests/qtest/json_parse/bad-41.json
0 → 100644
libtests/qtest/json_parse/bad-41.out
0 → 100644
| 1 | +exception: bad-41.json: JSON: offset 1: numeric literal: no digit after minus sign |
libtests/qtest/json_parse/bad-42.json
0 → 100644
| 1 | +-e123 |
libtests/qtest/json_parse/bad-42.out
0 → 100644
| 1 | +exception: bad-42.json: JSON: offset 1: numeric literal: no digit after minus sign |